It appears that we can - theoretically - build a single static library that includes both simulator and iPhone and iPad.

However, Apple has no documentation on this that I can find, and Xcode's default templates are NOT configured to do this.

I'm looking for a simple, portable, re-usable technique that can be done inside Xcode.

Some history:

  • In 2008, we used to be able to make single static-libs that included both sim and device. Apple disabled that.
  • Throughout 2009, we made pairs of static libs - one for sim, one for device. Apple has now disabled that too.

References:

  1. This is a great idea, it's an excellent approach, but it doesn't work:http://www.drobnik.com/touch/2010/04/universal-static-libraries/

    • There's some bugs in his script that means it only works on his machine - he should be using BUILT_PRODUCTS_DIR and/or BUILD_DIR instead of "guesstimating" them)
    • Apple's latest Xcode prevents you from doing what he's done - it simply will not work, due to the (Documented) change in how Xcode processes targets)
  2. Another SO questioner asked how to do it WITHOUT xcode, and with responses that focussed on the arm6 vs arm7 part - but ignored the i386 part:http://stackoverflow.com/questions/2793392/how-do-i-compile-a-static-library-fat-for-armv6-armv7-and-i386

    • Since Apple's latest changes, the Simulator part isn't the same as the arm6/arm7 difference any more - it's a different problem, see above)
asked Aug 19 '10 at 10:47
Adam
12.3k74573
 
   
   
Just wondering - why would you want that? Doesn't it make device library bigger and heavier on the device? – Cawas Jan 14 '11 at 23:14
3  
   
@Cawas - the "weight" of the library is irrelevant in 95% of real-world situations - for most of us, the libs are tiny, especially compared to e.g. displaying even just one single UIImageView. – Adam Jan 15 '11 at 14:58
1  
   
@Cawas - meanwhile, the value here is that you make it MUCH easier for other people to use/re-use your library. It becomes a one-stage drag/drop process. – Adam Jan 15 '11 at 14:59
3  
   
@Cawas - finally, a surprisingly valuable benefit: it is so easy to accidentally send someone the "wrong" compiled library - XCode does zero checks, and will happily compile the "wrong" architecture into the named file you thought was the "correct" architecture. Apple keeps breaking Xcode in this area - each new version has changes that mean "the button you pressed yesterday to compile your lib correctly will today compile it incorrectly". Until Apple stops messing us all around, we need to idiot-proof their bad UI :). – Adam Jan 15 '11 at 15:01
1  
   
That would really be great! Because right now as it is, we just can't rely on the simulator for anything little bit more complex. – Cawas Jan 19 '11 at 1:11

show 2 more comments

protected by Brad Larson♦ Apr 13 '11 at 15:52

This question is protected to prevent "thanks!", "me too!", or spam answers by new users. To answer it, you must have earned at least 10 reputation on this site.

6 Answers

up vote180down voteaccepted

ALTERNATIVES:

https://gist.github.com/3705459 - easy copy/paste of latest version (but install instructions may change - see below!)

Karl's library (http://stackoverflow.com/a/5721978/153422 ) takes much more effort to setup, but much nicer long-term solution (it converts your library into a Framework).


RECENT CHANGES:

  1. Info on how to use this script with a project-embedded-in-another-project (although I highly recommend NOT doing that, ever - Apple has a couple of show-stopper bugs in Xcode if you embed projects inside each other, from Xcode 3.x through to Xcode 4.6.x)

  2. Bonus script to let you auto-include Bundles (i.e. include PNG files, PLIST files etc from your library!) - see below (scroll to bottom)

  3. now supports iPhone5 (using Apple's workaround to the bugs in lipo). NOTE: the install instructions have changed (I can probably simplify this by changing the script in future, but don't want to risk it now)

  4. "copy headers" section now respects the build setting for the location of the public headers (courtesy of Frederik Wallner)

  5. Added explicit setting of SYMROOT (maybe need OBJROOT to be set too?), thanks to Doug Dickinson


SCRIPT (this is what you have to copy/paste)

For usage / install instructions, see below

############################################ c.f. http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4## Version 2.7## Latest Change:# - Supports iPhone 5 / iPod Touch 5 (uses Apple's workaround to lipo bug)# # Purpose:#   Automatically create a Universal static library for iPhone + iPad + iPhone Simulator from within XCode## Author: Adam Martin - http://twitter.com/redglassesapps# Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER)#set-e
set-o pipefail #################[ Tests: helps workaround any future bugs in Xcode ]#########
DEBUG_THIS_SCRIPT="false"if[ $DEBUG_THIS_SCRIPT ="true"]then
echo "########### TESTS #############"
echo "Use the following variables when debugging this script; note that they may change on recursions"
echo "BUILD_DIR = $BUILD_DIR"
echo "BUILD_ROOT = $BUILD_ROOT"
echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR"
echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR"
echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR"
echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR"fi#####################[ part 1 ]################### First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it)# (incidental: searching for substrings in sh is a nightmare! Sob) SDK_VERSION=$(echo ${SDK_NAME}| grep -o '.\{3\}$')# Next, work out if we're in SIM or DEVICEif[ ${PLATFORM_NAME}="iphonesimulator"]then
OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}else
OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}fi echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})"
echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}"######################[ end of part 1 ]#######################################[ part 2 ]#################### IF this is the original invocation, invoke WHATEVER other builds are required## Xcode is already building ONE target...## ...but this is a LIBRARY, so Apple is wrong to set it to build just one.# ...we need to build ALL targets# ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!)### So: build ONLY the missing platforms/configurations.if["true"== ${ALREADYINVOKED:-false}]then
echo "RECURSION: I am NOT the root invocation, so I'm NOT going to recurse"else# CRITICAL:# Prevent infinite recursion (Xcode sucks)export ALREADYINVOKED="true" echo "RECURSION: I am the root ... recursing all missing build targets NOW..."
echo "RECURSION: ...about to invoke: xcodebuild -configuration \"${CONFIGURATION}\" -project \"${PROJECT_NAME}.xcodeproj\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\" SYMROOT=\"${SYMROOT}\" xcodebuild -configuration "${CONFIGURATION}"-project "${PROJECT_NAME}.xcodeproj"-target "${TARGET_NAME}"-sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}" ACTION="build"#Merge all platform binaries as a fat binary for each configurations.# Calculate where the (multiple) built files are coming from:
CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos
CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}"
echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}" CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}"# ... remove the products of previous runs of this script# NB: this directory is ONLY created by this script - it should be safe to delete! rm -rf "${CREATING_UNIVERSAL_DIR}"
mkdir "${CREATING_UNIVERSAL_DIR}"#
echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}"
xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}""${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}""${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"########### Added: StackOverflow suggestion to also copy "include" files# (untested, but should work OK)#
echo "Fetching headers from ${PUBLIC_HEADERS_FOLDER_PATH}"
echo " (if you embed your library project in another project, you will need to add"
echo " a "UserSearchHeaders" build setting of: (NB INCLUDE THE DOUBLE QUOTES BELOW!)"
echo ' "$(TARGET_BUILD_DIR)/usr/local/include/"'if[-d "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"]then
mkdir -p "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"# * needs to be outside the double quotes?
cp -r "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"*"${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"fifi

INSTALL INSTRUCTIONS

  1. Create a static lib project
  2. Select the Target
  3. In "Build Settings" tab, set "Build Active Architecture Only" to "NO" (for all items)
  4. In "Build Phases" tab, select "Add ... New Build Phase ... New Run Script Build Phase"
  5. Copy/paste the script (above) into the box

...BONUS OPTIONAL usage:

  1. OPTIONAL: if you have headers in your library, add them to the "Copy Headers" phase
  2. OPTIONAL: ...and drag/drop them from the "Project" section to the "Public" section
  3. OPTIONAL: ...and they will AUTOMATICALLY be exported every time you build the app, into a sub-directory of the "debug-universal" directory (they will be in usr/local/include)
  4. OPTIONAL: NOTE: if you also try to drag/drop your project into another Xcode project, this exposes a bug in Xcode 4, where it cannot create an .IPA file if you have Public Headers in your drag/dropped project. The workaround: dont' embed xcode projects (too many bugs in Apple's code!)

If you can't find the output file, here's a workaround:

  1. Add the following code to the very end of the script (courtesy of Frederik Wallner): open "${CREATING_UNIVERSAL_DIR}"

  2. Apple deletes all output after 200 lines. Select your Target, and in the Run Script Phase, you MUST untick: "Show environment variables in build log"

  3. if you're using a custom "build output" directory for XCode4, then XCode puts all your "unexpected" files in the wrong place.

    1. Build the project
    2. Click on the last icon on the right, in the top left area of Xcode4.
    3. Select the top item (this is your "most recent build". Apple should auto-select it, but they didn't think of that)
    4. in the main window, scroll to bottom. The very last line should read: lipo: for current configuration (Debug) creating output file: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a

    ...that is the location of your Universal Build.


How to include "non sourcecode" files in your project (PNG, PLIST, XML, etc)

  1. Do everything above, check it works
  2. Create a new Run Script phase that comes AFTER THE FIRST ONE (copy/paste the code below)
  3. Create a new Target in Xcode, of type "bundle"
  4. In your MAIN PROJECT, in "Build Phases", add the new bundle as something it "depends on" (top section, hit the plus button, scroll to bottom, find the ".bundle" file in your Products)
  5. In your NEW BUNDLE TARGET, in "Build Phases", add a "Copy Bundle Resources" section, and drag/drop all the PNG files etc into it

Script to auto-copy the built bundle(s) into same folder as your FAT static library:

echo "RunScript2:"
echo "Autocopying any bundles into the 'universal' output folder created by RunScript1"
CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
cp -r "${BUILT_PRODUCTS_DIR}/"*.bundle "${CREATING_UNIVERSAL_DIR}"
answered Sep 5 '10 at 18:17
Adam
12.3k74573
 
1  
   
I've used this on a few projects now, and shipped stuff into the app-store that used this to build the libraries. All worked 100% OK, so I'm sticking with this for now (until Xcode 4, perhaps) – Adam Oct 12 '10 at 7:28
1  
   
Updated with Todd's correction – Adam Oct 22 '10 at 5:43
9  
   
Adam, Just want to say "Thanks!" for maintaining this, this script has saved my life (or at least let me avoid large amounts of work) on more than one occasion! – Alasdair Allan Apr 8 '11 at 19:54
9  
   
I think StackOverflow should allow +2, +5, +10 for upvotes if you are willing to sacrifice your own rep in situations like these. This saved me so much time! – tacos_tacos_tacos Oct 24 '11 at 15:37
2  
   
Can anyone confirm if this method works for XCode 4.5? I am trying to compile a static library and use it in my main project. I am able to run this on the device but not on the simulator. This is the error I get: missing required architecture i386 in file /Users/alex/Documents/iphone/production/iphone/mymedia/libMyUnrar4iOS.a (2 slices) – Alex1987 Sep 17 '12 at 18:16

show 33 more comments

I've made an XCode 4 project template that lets you make a universal framework as easily as making a regular library:

https://github.com/kstenerud/iOS-Universal-Framework

answered Apr 19 '11 at 20:01
Karl
2,68811530
 
   
   
Its worked like a charm! Thx for the templates. – Ben Apr 20 '11 at 8:47
   
   
Looks nice. Good job! – Eonil May 11 '11 at 10:32
   
   
Worked perfectly for me (good documentation was as key as the code itself... nicely done) – Doug HaysSep 22 '11 at 20:42
1  
   
Great work, thank you. – Jano Oct 21 '11 at 12:51
1  
   
That was so easy! Thanks for providing thorough documentation. – Richard Smith Sep 20 '12 at 9:16

show 6 more comments

There is a command-line utility xcodebuild and you can run shell command within xcode. So, if you don't mind using custom script, this script may help you.

#Configurations.#This script designed for Mac OS X command-line, so does not use Xcode build variables.#But you can use it freely if you want.

TARGET=sns
ACTION="clean build"
FILE_NAME=libsns.a DEVICE=iphoneos3.2
SIMULATOR=iphonesimulator3.2#Build for all platforms/configurations. xcodebuild -configuration Debug-target ${TARGET}-sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Debug-target ${TARGET}-sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release-target ${TARGET}-sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release-target ${TARGET}-sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO #Merge all platform binaries as a fat binary for each configurations. DEBUG_DEVICE_DIR=${SYMROOT}/Debug-iphoneos
DEBUG_SIMULATOR_DIR=${SYMROOT}/Debug-iphonesimulator
DEBUG_UNIVERSAL_DIR=${SYMROOT}/Debug-universal RELEASE_DEVICE_DIR=${SYMROOT}/Release-iphoneos
RELEASE_SIMULATOR_DIR=${SYMROOT}/Release-iphonesimulator
RELEASE_UNIVERSAL_DIR=${SYMROOT}/Release-universal rm -rf "${DEBUG_UNIVERSAL_DIR}"
rm -rf "${RELEASE_UNIVERSAL_DIR}"
mkdir "${DEBUG_UNIVERSAL_DIR}"
mkdir "${RELEASE_UNIVERSAL_DIR}" lipo -create -output "${DEBUG_UNIVERSAL_DIR}/${FILE_NAME}""${DEBUG_DEVICE_DIR}/${FILE_NAME}""${DEBUG_SIMULATOR_DIR}/${FILE_NAME}"
lipo -create -output "${RELEASE_UNIVERSAL_DIR}/${FILE_NAME}""${RELEASE_DEVICE_DIR}/${FILE_NAME}""${RELEASE_SIMULATOR_DIR}/${FILE_NAME}"

Maybe looks inefficient(I'm not good at shell script), but easy to understand. I configured a new target running only this script. The script is designed for command-line but not tested in :)

The core concept is xcodebuild and lipo.

I tried many configurations within Xcode UI, but nothing worked. Because this is a kind of batch processing, so command-line design is more suitable, so Apple removed batch build feature from Xcode gradually. So I don't expect they offer UI based batch build feature in future.

answered Sep 1 '10 at 9:43
Eonil
14.1k1186206
 
   
   
Thanks, it's really interesting that the underlying simple commands still appear to work - it's just that Apple broke their GUI spectacularly. Looks like I could make a fully custom project template that would "not suck" and fix the things Apple broke, by pre-making all the Targets, and wiring up this script with xcode build vars. I'll try it out on my next project :) – Adam Sep 2 '10 at 20:01
1  
   
I used a script similar to this and put it under a new target containing only the shell script. The recursive build script above is very clever, but unnecessarily confusing. – benzado Feb 9 '11 at 18:52
1  
   
I prefer shell scripts for stuff like this, here is my take gist.github.com/3178578 – slf Jul 25 '12 at 20:47
   
   
@benzado Yeah I avoided complexity intentionally because I think shell script must be easy to read for modifying. – Eonil Jul 26 '12 at 5:42
   
   
lipo: can't open input file: /Debug-iphoneos/ – Dima Goltsman Mar 11 at 9:11

add comment (requires 50 reputation)

I have spent many hours trying to build a fat static library that will work on armv7, armv7s, and the simulator. Finally found a solution here:http://www.nearinfinity.com/blogs/tyler_vernon/2012/07/17/creating-and-using-static-libraries-for-iphone-using-xcode-4.3.html

The gist is to build the two libraries (one for the device and then one for the simulator) separately, rename them to distinguish from each other, and then lipo -create them into one library.

lipo -create libPhone.a libSimulator.a -output libUniversal.a

I tried it and it works!

answered Nov 28 '12 at 16:09
g_low
760411
 
1  
   
I suggest you read the accepted answer. You may find that this has been covered already, 2 years previously... – Adam Jan 21 at 0:08
1  
   
I read it, used the script, but it was not working for me for armv7s. – g_low Feb 5 at 10:43
2  
   
the lipo command doesnt work on the script, but manually it works great! 10x – Dima Goltsman Mar 11 at 9:34
1  
   
+1 This was really all I needed, not a huge "make-a-framework" script. – LearnCocos2D Jun 5 at 22:44

add comment (requires 50 reputation)

I've made this into an Xcode 4 template, in the same vein as Karl's static framework template.

I found that building static frameworks (instead of plain static libraries) was causing random crashes with LLVM, due to an apparent linker bug - so, I guess static libraries are still useful!

answered Mar 29 '12 at 15:54
 
   
   
Hi Michael, I have tried your static library template but I can compile for simulator but not for device, here the error: ** BUILD FAILED ** The following build commands failed: ProcessPCH /var/folders/qy/ncy6fkpn6677qt876ljrc54m0000gn/C/com.apple.Xcode.501/SharedPreco‌​mpiledHeaders/MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi/MenuBarUnivers‌​al-Prefix.pch.pth MenuBarUniversal/MenuBarUniversal-Prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler (1 failure) Showing first 200 notices only Command /bin/sh failed with exit code 65 – Kappe Nov 1 '12 at 10:40

add comment (requires 50 reputation)

Great job! I hacked together something similar, but had to run it separately. Having it just be part of the build process makes it so much simpler.

One item of note. I noticed that it doesn't copy over any of the include files that you mark as public. I've adapted what I had in my script to yours and it works fairly well. Paste the following to the end of your script.

if[-d "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include"]then
mkdir -p "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
cp "${CURRENTCONFIG_DEVICE_DIR}"/usr/local/include/* "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
fi
answered Dec 1 '10 at 12:48
 
  upvote
  flag
OK, i've added that to the answer above. (haven't had a chance to test it yet, but looks correct to me) – Adam Dec 2 '10 at 15:02

Build fat static library (device + simulator) using Xcode and SDK 4+的更多相关文章

  1. 创建静态库Static Library(Framework库原理相似)

    在项目开发的过程中,经常使用静态库文件.例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节. 简介: 库是一些没有ma ...

  2. iOS 元件组件-创建静态库static library

    概述 在项目开发的过程中,经常使用静态库文件.例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节. 库是一些没有mai ...

  3. 使用Xcode 5创建Cocoa Touch Static Library(静态库)

    转自:http://blog.csdn.net/jymn_chen/article/details/21036035 首先科普一下静态库的相关知识: 程序编译一般需经预处理.编译.汇编和链接几个步骤. ...

  4. Creating and Using Static Libraries for iPhone using Xcode 4.3

    Recently, after developing a collection of applications for iPhone that were intended to be used as ...

  5. ios中静态库的创建和使用、制作通用静态库(Cocoa Touch Static Library)

    创建静态库可能出于以下几个理由: 1.你想将工具类代码或者第三方插件快捷的分享给其他人而无需拷贝大量文件.2.你想让一些通用代码处于自己的掌控之下,以便于修复和升级.3.你想将库共享给其他人,但不想让 ...

  6. Objective-C categories in static library

    ASK: Can you guide me how to properly link static library to iphone project. I use staic library pro ...

  7. How do I fix "selector not recognized" runtime exceptions when trying to use category methods from a static library?

    https://developer.apple.com/library/content/qa/qa1490/_index.html A: If you're seeing a "select ...

  8. iOS制作Static Library(静态库),实现多工程的连编

    在iOS开发中,我们会发现一些偏底层或基础代码是直接可以复用的,当我们换一个项目,改变的只需要是偏上层的业务逻辑代码,所以我们可以把这部分基础代码制作为一个静态库static library,并不断扩 ...

  9. Can't debug c++ project because unable to static library start program *.lib

    Can't debug c++ project because unable to static library start program *.lib   I'm using a library ( ...

随机推荐

  1. numpy之统计函数和布尔数组方法

    统计函数 可以通过numpy的统计函数对整个数组或者某个轴向的数据进项统计计算. 所谓的轴向,其实就是n维向量的某一维.或者说某一行,某一列. sum对数组(向量)中全部或某个轴向的元素求和,长度为0 ...

  2. 安装Visual C ++进行跨平台移动开发

    Visual Studio 2015   Visual Studio文档的新家是docs.microsoft.com上的Visual Studio 2017文档 . 有关Visual Studio 2 ...

  3. monkey实战--测试步骤、常用参数、常规monkey命令

    简要步骤:adb devices---了解包名--adb shell monkey -p 包名 -v 运行次数(多个参数的组合形成不同的用例以求最大的覆盖)--当崩溃或无响应时分析monkey日志 常 ...

  4. 【转】使用JMeter 完成常用的压力测试(一)

    本文介绍了 JMeter 相关的基本概念.并以 JMeter 为例,介绍了使用它来完成最常用的三种类型服务器,即 Web服务器.数据库服务器和消息中间件,压力测试的方法.步骤以及注意事项. 讲到测试, ...

  5. HDFS之五:Hadoop 拒绝远程 9000 端口访问

        最近学习Hadoop 时发现在本机访问 hadoop 9000 端口没有问题,但是远程机器访问 9000端口时不能访问,通过telnet 命令诊断发现发现无法访问端口,经过网上搜索解决方案结合 ...

  6. 《PYTHON学习手册》(《Learing Python》--Mark Lutz)书摘

    1. Python是为了让脚本的质量等级再提升几个级别. 2. <learning Python>和<programming Python>反映了作者培训内容的两部分:核心语言 ...

  7. xml处理模块

    xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的 ...

  8. phpmailer绑定邮箱

    1.配置 <?php return array ( 'email_host' => 'smtp.aliyun.com', 'email_port' => '25', 'email_u ...

  9. mybatis foreach标签的解释 与常用之处

    情景:查询数据库中文章的相关文章   文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割 查询完一个文章后可以把tags字段构造为一个List<String> 然后利用这 ...

  10. VC散列表

    vc下有2个版本的散列表类,hash_map和unordered_map,hash_map位于stdext命名空间,unordered_map在std命名空间(vs2008及其之后的版本可用),官方推 ...