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

时间:2013-11-11 23:08:51

标签: build cmake

我有这个目录结构:

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

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

共享库2需要链接共享库2.这个我解决了,如何解决include?

这是我的共享库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} )

但它不起作用。

1 个答案:

答案 0 :(得分: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}。我希望这个变量实际上是空的 - 你当然不会在你的示例代码中将它设置在任何地方。 可用的是变量shlib1 - 这是在add_library调用中创建的目标,但在此处不太有用。

所以,你在“code / shared lib 1 / CMakeLists.txt”中的命令应该是这样的:

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


如果您不想使用target_include_directories(或必须使用旧版本的CMake),则必须在“code / shared lib 2 / CMakeLists.txt”中使用include_directories 。但是,您必须将路径传递给“code / shared lib 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中设置一个缓存变量(使其在任何地方都可用),指定subdir的公共搜索路径。例如,在“code / shared lib 1 / CMakeLists.txt”中:

set(shlib1_includes "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL
    "Public include path(s) for shlib1")

然后在“code / shared lib 2 / CMakeLists.txt”中:

include_directories(${shlib1_includes})