0

现在我正在用 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) 应用程序 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应该只引入依赖项。对于我们的示例项目,这可能不是问题,但在其他情况下,引入的冗余库可能会导致编译错误,因为它们需要正确的搜索路径。因此,我想知道是否有办法消除这些不必要的库。谢谢!

4

2 回答 2

1

CMake 可传递地添加依赖库,可以通过将属性 LINK_INTERFACE_LIBRARIES 设置为空字符串来关闭它。如果您执行 SET_TARGET_PROPERTIES(lib3 PROPERTIES LINK_INTERFACE_LIBRARIES "") 那么在链接 app 时,CMake 不会生成从 app 到 lib1 和 lib2 的依赖项。

于 2012-09-13T07:49:36.433 回答
0

如果您正在创建静态库,那么我同意 CMake 引入了不必要的依赖项。但是,您正在构建动态库,我不认为 CMake 在这里添加了不必要的依赖项。你有一个动态库链。在这种情况下,如果您链​​接 in lib3,则链接器也需要拉入lib2,这将导致链接器拉入lib1以满足链接应用程序的所有符号依赖项。

于 2012-09-12T14:55:50.450 回答