CMAKE - 解决项目中图书馆之间的依赖关系
问题描述:
我使用CMAKE来构建一个由许多库和可执行文件组成的相当大的项目。我如何指定库库依赖关系存在问题,并且事情不能按需要完全工作。示意图我的项目如下所示:CMAKE - 解决项目中图书馆之间的依赖关系
CMakeLists.txt
lib1/src/CMakeLists.txt
lib2/src/CMakeLists.txt
app/src/CMakeLists.txt
I.e.我有两个库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)
为了确保dependies满意我有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命令 - 事情将会成功。所以看来我没有设法正确配置依赖关系?需要注意的是,从第一内建尝试输出厂名显示:
Linking C shared library liblib1.so
所以构建本身suceeded - 但它似乎是一个版本将无法使用此建实例期间创建的liblib1.s0文件来解决LIB2依赖?
我试过了 - 再次移除 - 几个varietes的link_directories()和target_depends()没有成功。
感谢您的任何提示?
乔金 -
答
看来,得到的CMake通过
set_target_properties(lib1_static PROPERTIES OUTPUT_NAME lib1)
使用混淆试试这个:
target_link_libraries(lib2_shared lib1)
或删除这些属性设置。
答
我正在使用CMake版本2.6 - 我升级到CMake 2.8,然后它为我工作。
好的 - 谢谢你的回答;正如前面提到的,我通过升级CMake来解决它。但我确实感觉到我的CMakeLists.txt中的整个静态/共享处理非常复杂 - 所以也许我可以按照你的建议来简化它。 – user422005 2012-02-07 07:51:06