我有一个CMake C ++项目,它指定了可执行文件和库目标:
...
add_library(my_lib SHARED ${MY_MAIN_SOURCES})
target_link_libraries(my_lib ${MY_MAIN_LIBS})
add_executable(all_tests util/test/run.cc ${MY_TEST_FILES} ${MY_MAIN_SOURCES})
target_link_libraries(all_tests ${MY_MAIN_LIBS})
如果我使用Clang构建,一切正常,我同时获得'all_tests'可执行文件和'my_lib.dylib'库:
mkdir build
cd build
cmake ../..
make
但是,如果我使用Xcode构建,我只会获得'all_tests'并且我的库不存在。
mkdir build
cd build
cmake -G Xcode ../..
xcodebuild
当我检查生成的Xcode项目时,我发现失败的库目标正确地列出了项目其余部分的依赖关系,但它的构建阶段列表中没有链接步骤。但是,工作可执行目标也是类似的,因为它列出了依赖项和编译步骤但没有链接步骤。这对于生成的项目是否有所预期?
我是否需要在CMake文件中使用Xcode构建动态库? (FWIW,在Windows上构建相同的项目可以生成两种目标。)
(注意,我使用的版本是CMake 3.0.2和Xcode 6.0.1;这些兼容吗?我在OS X 10.9.5 Mavericks上做了所有这些。)
答案 0 :(得分:1)
问题似乎是我试图从其他库中编译一个综合库。我原来的问题(实际上对我来说)不清楚,因为结果是CMake文件中的MY_MAIN_SOURCES
和MY_MAIN_LIBS
都引用了项目中的其他库;只有MY_TEST_FILES
引用了实际的源代码。
所以为了解决这个问题,我添加了一个虚拟文件:
// Dummy.cc
// namespace {
// const int dummy = 0;
// }
并将其包含在我的构建中:
add_library(my_lib SHARED ${MY_MAIN_SOURCES} Dummy.cc)
target_link_libraries(my_lib ${MY_MAIN_LIBS})
通过此更改,生成的Xcode项目可以正确输出可执行文件库和综合库。