CMAKE - 解决项目中库之间的依赖关系

时间:2012-01-30 09:30:49

标签: cmake

我正在使用CMAKE构建一个包含许多库和可执行文件的非常大的项目。我如何指定库库依赖关系存在问题,并且事情不能完全按照需要运行。原理上我的项目如下所示:

CMakeLists.txt
lib1/src/CMakeLists.txt
lib2/src/CMakeLists.txt
app/src/CMakeLists.txt

即。我有两个库lib1和lib2,其中lib2依赖于lib1,app依赖于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()没有成功。

感谢任何提示?

乔金姆

2 个答案:

答案 0 :(得分:0)

看来,CMake因使用

而感到困惑
set_target_properties( lib1_static PROPERTIES OUTPUT_NAME lib1)

试试这个:

target_link_libraries( lib2_shared lib1 )

或删除这些属性设置。

答案 1 :(得分:0)

我使用的是CMake 2.6版本 - 我升级到CMake 2.8然后它适用于我。