我有这个目录结构:
- 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} )
但它不起作用。
答案 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})