使用Xcode 6.3.1和CMake 3.2.2。
我有一个项目需要链接一个库。这个库被包含在Xcode项目中作为代码,编译后与主可执行文件进行链接。
该项目是由CMake生成的。下面是CMakeLists.txt的一些摘录:
add_library(mylib ${mylib_HEADERS} pch.cpp source/mylib/xxx.cpp)
...
add_executable(${MAIN_BINARY_NAME} MACOSX_BUNDLE ${MAIN_HEADERS} ${MAIN_CODE_FILES} ${MAIN_ICON_FILES} ${MAIN_DYLIBS} )
target_link_libraries (${MAIN_BINARY_NAME} mylib)
生成了我的 xcodeproj 后,我通过 cmd + B 构建了一个正常版本,它可以编译和链接(并运行)而没有问题。但是当我尝试归档时,它却出现了链接器错误。
使用命令行 xcodebuild,我比较了两个版本,摘录如下:
发布版本
Libtool /Users/username/dev/MyProject/cmake-master/libs/mylib/RelWithDebInfo/libmylib.a normal x86_64
存档构建
Libtool /Users/username/Library/Developer/Xcode/DerivedData/MyProject-facomnlcdbuduqeohionewjyectq/ArchiveIntermediates/MyProject/IntermediateBuildFilesPath/UninstalledProducts/libmylib.a normal x86_64
...
Ld /Users/username/Library/Developer/Xcode/DerivedData/MyProject-facomnlcdbuduqeohionewjyectq/ArchiveIntermediates/MyProject/InstallationBuildProductsLocation/Applications/MyProject.app/Contents/MacOS/MyProject normal x86_64
...
clang: error: no such file or directory: '/Users/username/dev/myproject/cmake-master/libs/mylib/RelWithDebInfo/libmylib.a'
因此,在发布版本中,它正确地使用了由cmake指定的构建路径。在存档构建中,它忽略了构建路径,而是编译并将结果库放在默认的中间文件夹中 - 但在链接exe时,它再次查找cmake指定的构建路径,然后无法找到库。
看起来像是xcode中的一个bug,因为cmake覆盖了构建路径...?
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library )
。 - yano