我正在使用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()没有成功。
感谢任何提示?
乔金姆
答案 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然后它适用于我。