如何减少CMake引入的不必要的C ++库依赖?

时间:2012-09-12 14:48:32

标签: c++ visual-studio-2010 cmake

现在我正在用CMake构建一个C ++项目。我发现CMake会在项目中引入不必要的库依赖。举个例子,我的项目由四部分组成:1)lib1 2)lib2 3)lib3和4)app:

------lib1---
        |----
      lib2---
        |----
      lib3---
        |----
      app---

app中的源代码将构建一个程序,该程序依赖于lib3中创建的动态库。但是,lib3依赖于lib2中创建的动态库,依此类推。我构建了以下CMake脚本来构建VC10项目:     1)Root CMakeLists:

   cmake_minimum_required( VERSION 2.6 )

    project (test)


    add_subdirectory(lib1)

    add_subdirectory(lib2)

    add_subdirectory(lib3)

    add_subdirectory(app)

2)lib1 CMakeLists.txt

add_definitions (-DEXP_STL )
add_library(lib1 SHARED lib1.cxx)

3)lib3 CMakeLists.txt

add_definitions (-DEXP_STL )
add_library(lib3 SHARED lib3.cxx)
target_link_libraries(lib3 lib2)

4)app CMakeLists.txt

add_executable(app main.cpp)
target_link_libraries(app lib3)

使用这些CMake脚本,我在构建VC10项目时没有任何问题。但是,我注意到CMake会在VC10的库之间引入不必要的库依赖。例如,对于app应用程序,它只依赖于一个库,即lib3。但是,在VC10项目中,我注意到它添加了以下附加依赖项:

..\lib3\Debug\lib3.lib
..\lib2\Debug\lib2.lib
..\lib1\Debug\lib1.lib

但是,在CMake脚本中,应该只引入lib3依赖项。对于我们的示例项目,它可能不是问题,但在其他情况下,引入的冗余库可能导致编译错误,因为它们需要正确的搜索路径。因此,我想知道是否有办法消除这些不必要的库。谢谢!

2 个答案:

答案 0 :(得分:1)

CMake可以在传递中添加依赖库,可以通过将属性LINK_INTERFACE_LIBRARIES设置为空字符串来关闭它。如果你这样做   SET_TARGET_PROPERTIES(lib3 PROPERTIES LINK_INTERFACE_LIBRARIES“”) 然后当链接app时,CMake不会生成从app到lib1和lib2的依赖。

答案 1 :(得分:0)

如果你正在创建staic库,那么我会同意CMake引入了不必要的依赖。但是,您正在构建动态库,我不相信CMake在这里添加了不必要的依赖项。你有一系列动态库。在这种情况下,如果链接到lib3,链接器也需要引入lib2,这将导致链接器引入lib1以满足所有符号依赖关系链接你的申请。