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

标签 build cmake

我有这个目录结构:

- 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/

相关文章:

c - OSX + homebrew + CMake + libpng 版本不匹配问题

c++ - 使用 ndk-build 链接现有的静态库

c++11 - 通过 CMake 或预处理器检查检测 C++ 编译器对 [[noreturn]] 的支持?

c++ - 由于找不到conanfile.py,使用CMake,conan和Vulkan SDK的Github操作失败

c++ - 如何使用 CLion 生成 dbg 文件以用于 VerySleepy

exception - Android Studio Gradle 构建错误 - 指定的属性 'manifest' 不存在

java - 将 jar 文件安装到 Maven 构建中的特定位置

java - 如何在 HYBRIS 中只构建特定租户?

angular - Dart 中的构建时值注入(inject)

indexing - TFS 2015 中的索引源和发布符号步骤失败