gpt4 book ai didi

build - 如何为其他目录添加包含规则?

转载 作者:行者123 更新时间:2023-12-04 18:43:19 25 4
gpt4 key购买 nike

我有这个目录结构:

- code
- shared lib 1
- unit tests
- shared lib 2
- unit tests
- extern libs
- gtest + gmock
- extern lib

每个目录都有一个 CMakeLists.txt 文件。

共享库2需要链接共享库2。这个我解决了,如何解决包含?

这是我的共享库 1 的 CMakeList.txt 文件:
SET( LIB_OUTPUT_NAME shlib1 )

FILE (GLOB HEADER_FILES ./*.hpp)
FILE (GLOB SOURCE_FILES ./*.cpp)

ADD_LIBRARY (${LIB_OUTPUT_NAME} SHARED ${SOURCE_FILES} ${HEADER_FILES} )

对于共享库 2:
SET( LIB_OUTPUT_NAME shlib2 )

# what to put here? this doesn't work
include_directories(${shlib1})

FILE( GLOB HEADER_FILES ./*.hpp )
FILE( GLOB SOURCE_FILES ./*.cpp )

ADD_LIBRARY( ${LIB_OUTPUT_NAME} SHARED ${SOURCE_FILES} ${HEADER_FILES} )

target_link_libraries( ${LIB_OUTPUT_NAME} shlib1 )

PS:我有更多的库——不仅仅是 2 个。这就是为什么我正在寻找更通用的解决方案。

我尝试使用 target_include_directories像这样 :
target_include_directories( ${LIB_OUTPUT_NAME} PUBLIC ${shlib1} )

但它没有用。

最佳答案

如果您使用的是 CMake v2.8.11 或更新版本,那么 target_include_directories 确实是要走的路。

从您的问题中不清楚您已将此命令添加到哪个 CMakeLists.txt 中。如果您试图指定任何依赖于 shlib1 的目标应该将“code/shared lib 1”作为包含搜索路径,然后您应该将命令添加到“code/shared lib 1/CMakeLists.txt”。

在您的 target_include_directories调用,您指定公共(public)搜索路径应为 ${shlib1} .我希望这个变量实际上是空的——你肯定没有在示例代码中的任何地方设置它。然而可用的是变量 shlib1 - 这是在您的 add_library 中创建的目标打电话,但在这里用处不大。

因此,您在“code/shared lib 1/CMakeLists.txt”中的命令应该类似于:

target_include_directories(${LIB_OUTPUT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

如果您不想使用 target_include_directories (或必须迎合旧版本的 CMake),您必须使用 include_directories 在“代码/共享库 2/CMakeLists.txt”中。但是,您必须将路径传递给“代码/共享库 1”。

您可以只使用相对路径,但这可能不是最强大的解决方案:
include_directories("../shared lib 1")

或假设您在“代码”中有顶级 CMakeLists.txt,您可以这样做:
include_directories("${CMAKE_SOURCE_DIR}/shared lib 1")

但这也好不到哪里去。

一个更强大的选项可能是让每个子目录成为一个单独的项目(即在每个子目录的 CMakeLists.txt 的顶部有一个 project 调用)。这使得变量 <projectName>_SOURCE_DIR可用于所有后续 CMake 文件。所以,如果你的第一个共享库也有 project(sharedlib1) ,然后在“code/shared lib 2/CMakeLists.txt”中你可以这样做:
include_directories(${sharedlib1_SOURCE_DIR})

或者另一种合理的解决方案是在每个子目录的 CMakeLists.txt 中设置一个缓存变量(使其随处可用),指定该子目录的公共(public)搜索路径。例如,在“代码/共享库 1/CMakeLists.txt”中:
set(shlib1_includes "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL
"Public include path(s) for shlib1")

然后在“代码/共享库 2/CMakeLists.txt”中:
include_directories(${shlib1_includes})

关于build - 如何为其他目录添加包含规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19917794/

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