cmake生成的Xcode项目-发布版本构建成功,但存档失败,出现链接器错误。

10

使用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覆盖了构建路径...?

1个回答

6
与此同时,我发现了一种解决方法,这样至少可以归档而不会出现连接器错误。在cmakelists.txt中指定“每个配置构建路径”,像这样:

Specify a "per configuration build path" in the cmakelists.txt like this:

set_target_properties(mylib PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)

归档将编译库,以便在链接时找到它


2
请接受这个答案!在 Xcode 8.1 中仍存在问题,而这解决了它。我更喜欢在项目级别上设置,例如 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library ) - yano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接