2012-01-30 113 views
2

我使用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()没有成功。

感谢您的任何提示?

乔金 -

回答

0

看来,得到的CMake通过

set_target_properties(lib1_static PROPERTIES OUTPUT_NAME lib1) 

使用混淆试试这个:

target_link_libraries(lib2_shared lib1) 

或删除这些属性设置。

+0

好的 - 谢谢你的回答;正如前面提到的,我通过升级CMake来解决它。但我确实感觉到我的CMakeLists.txt中的整个静态/共享处理非常复杂 - 所以也许我可以按照你的建议来简化它。 – user422005 2012-02-07 07:51:06

0

我正在使用CMake版本2.6 - 我升级到CMake 2.8,然后它为我工作。