cmake 生成的 Xcode-project - release-build 工作但存档因链接器错误而失败
cmake generated Xcode-project - release-build works but archive fails on linker errors
使用 Xcode 6.3.1,CMake 3.2.2
我有一个与图书馆链接的项目。这个库作为代码包含在 xcode-project 中,编译后与主要可执行文件链接。
项目是用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'
</pre>
因此对于发布构建,它正确地使用了 cmake 指定的构建路径。对于存档构建,它会忽略构建路径,而是编译并将生成的库放在默认中间文件夹中 - 但是当与 exe 链接时,它会再次查看 cmake 指定的构建路径,然后失败找到图书馆。
它看起来像 xcode 中的错误,因为 cmake 覆盖了构建路径...?
与此同时,我找到了一个解决方法,所以至少它在没有链接器错误的情况下存档。在 cmakelists.txt 中指定一个 "per configuration build path",如下所示:
set_target_properties(mylib PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
存档将编译库 - 稍后在链接时找到它
使用 Xcode 6.3.1,CMake 3.2.2
我有一个与图书馆链接的项目。这个库作为代码包含在 xcode-project 中,编译后与主要可执行文件链接。
项目是用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' </pre>
因此对于发布构建,它正确地使用了 cmake 指定的构建路径。对于存档构建,它会忽略构建路径,而是编译并将生成的库放在默认中间文件夹中 - 但是当与 exe 链接时,它会再次查看 cmake 指定的构建路径,然后失败找到图书馆。
它看起来像 xcode 中的错误,因为 cmake 覆盖了构建路径...?
与此同时,我找到了一个解决方法,所以至少它在没有链接器错误的情况下存档。在 cmakelists.txt 中指定一个 "per configuration build path",如下所示:
set_target_properties(mylib PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/library)
存档将编译库 - 稍后在链接时找到它