5

我有这个目录结构:

- 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} )

但它没有用。

4

1 回答 1

6

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

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

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

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

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


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

可以只使用相对路径,但这可能不是最强大的解决方案:

include_directories("../shared lib 1")

或假设您在“代码”中有顶级 CMakeLists.txt,您可以这样做:

include_directories("${CMAKE_SOURCE_DIR}/shared lib 1")

但这也好不到哪里去。

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

include_directories(${sharedlib1_SOURCE_DIR})

或者另一种合理的解决方案是在每个子目录的 CMakeLists.txt 中设置一个缓存变量(使其随处可用),指定该子目录的公共搜索路径。例如,在“代码/共享库 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})
于 2013-11-12T01:04:40.047 回答