【发布时间】:2012-02-22 02:56:49
【问题描述】:
我正在使用 CMAKE 构建一个包含许多库和可执行文件的大型项目。我指定库依赖项的方式有问题,并且事情不能完全按预期工作。我的项目示意图如下所示:
CMakeLists.txt
lib1/src/CMakeLists.txt
lib2/src/CMakeLists.txt
app/src/CMakeLists.txt
即我有两个库 lib1 和 lib2,其中 lib2 依赖于 lib1,而应用程序同时依赖于 lib1 和 lib2。我使用共享链接和静态链接构建库:
add_library(lib1_static STATIC lib1_src)
add_library(lib1_shared SHARED lib1_src)
set_target_properties( lib1_static PROPERTIES OUTPUT_NAME lib1)
set_target_properties( lib1_shared PROPERTIES OUTPUT_NAME lib2)
为了确保依赖项得到满足,我将 target_link_libraries() 设置为:
#lib2/src/CMakeLists.txt:
target_link_libraries( lib2_shared lib1_shared )
target_link_libraries( lib2_static lib1_static )
对于应用程序:
#app/src/CMakeLists.txt
target_link_libraries( app_static lib2_static ) # <- No explicit dependance on lib1
target_link_libraries( app_shared lib2_shared )
现在 - 问题是当我重新构建时它会编译很长时间,但是在创建 liblib2.so 文件时出现错误消息:
make[2]: *** No rule to make target 'lib1/src/liblib1.so' needed by 'lib2/src/liblib2.so'. Stop.
出现。如果我然后发出一个新的 make 命令 - 事情将成功构建。所以看来我没有设法正确配置依赖项?请注意,第一次构建尝试的 make 输出显示:
Linking C shared library liblib1.so
所以构建本身已经成功 - 但似乎构建不会使用在此构建实例期间创建的 liblib1.s0 文件来解决 lib2 依赖项?
我已经尝试过 - 并再次删除 - 几种 link_directories() 和 target_depends() 都没有成功。
【问题讨论】:
标签: cmake