现在我正在用CMake构建一个C++项目。我发现CMake会在项目中引入不必要的库依赖。举个例子,我的项目由四部分组成:1)lib1 2)lib2 3)lib3和4)app:
------lib1---
|----
lib2---
|----
lib3---
|----
app---
app
中的源代码将构建一个程序,该程序依赖于在lib3
中创建的动态库。然而,lib3
依赖于在lib2
中创建的动态库等等。我构建了以下CMake脚本来构建VC10项目:1)根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项目中,我注意到它添加了以下额外的依赖项:
..lib3Debuglib3.lib
..lib2Debuglib2.lib
..lib1Debuglib1.lib
然而,在CMake脚本中,应该只引入lib3
依赖项。对于我们的示例项目,这可能不是问题,但在其他情况下,引入的冗余库可能会导致编译错误,因为它们需要正确的搜索路径。因此,我想知道是否有办法消除这些不必要的图书馆。谢谢
CMake通过转换添加依赖库,可以通过将属性LINK_INTERFACE_libraries设置为空字符串来关闭依赖库。如果你这样做SET_TARGET_PROPERTIES(lib3 PROPERTIES LINK_INTERFACE_LIBRARIES")则CMake在链接应用程序时不会生成从应用程序到lib1和lib2的依赖关系。
如果您正在创建staic库,那么我同意CMake引入了不必要的依赖关系。然而,您正在构建动态库,我不认为CMake在这里添加了不必要的依赖项。您有一个动态库链。在这种情况下,如果您在lib3
中进行链接,则链接器还需要在lib2
中进行拉入,这将导致链接器拉入lib1
,以满足链接应用程序的所有符号依赖关系。