gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:57:32 30 4
gpt4 key购买 nike

现在我正在使用 CMake 构建一个 C++ 项目。我发现 CMake 会在项目中引入不必要的库依赖。举个例子,我的项目由四部分组成:1)lib1 2)lib2 3)lib3 and 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 项目中,我注意到它添加了以下附加依赖项:

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

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

最佳答案

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

关于c++ - 如何减少 CMake 引入的不必要的 C++ 库依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12390874/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com