【问题标题】:How to add include rule for other directory?如何为其他目录添加包含规则?
【发布时间】:2013-11-11 23:08:50
【问题描述】:

我有这个目录结构:

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

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

共享库2需要链接共享库2。这个我解决了,如何解决include?​​p>

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

但是没有用。

【问题讨论】:

    标签: build cmake


    【解决方案1】:

    如果您使用的是 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。但是,您必须将路径传递给“代码/共享库 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 中设置一个缓存变量(使其在任何地方都可用),指定该子目录的公共搜索路径。例如在“code/shared lib 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})
    

    【讨论】:

      猜你喜欢
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多