如何在普通root下顺畅添加各种第三方库的include目录?

时间:2015-01-27 23:34:36

标签: cmake

我正在尝试学习cmake,但我找不到解决常见问题的聪明方法。

我想使用几个第三方库。让我们说我把它们都放在同一个根下(更高级的情况:有几个这样的根)。假设他们的结构如下:

root
--Lib1                 // headers here 
--Lib2
  --include            // headers here
--Lib3                 // headers here
  --private_headers    // ...and here (non public)

我想实现一个目标,我可以在cmakelists.txt中指定我想使用哪些库但是:

  • 没有指定root的位置 - 它必须独立于我的libs目录结构(可能它应该来自一些标准的cmake env变量,但似乎没有CMAKE_xxx_PATH适合)

  • 没有打扰Lib3中的私有标头依赖项和子文件夹(我只想包含顶级标题,并且必须找到包含它们相对路径的所有较低级别标题)

如何实现这些目标?

2 个答案:

答案 0 :(得分:2)

  

任何具有任何libs目录结构的人使用

不会开箱即用。最后,您需要所有第三方库的路径,无论它们位于公共根目录还是单独的目录中。在任何情况下,至少需要XX_INCLUDE_PATHXX_LIBRARIES来指向这些包中的每个位置。

您的问题的答案是为每个库使用FindXXX.cmake模块。 它们旨在包含用于查找任何第三方软件包的库/包括dirs的逻辑。 cmake来with a pile of them,有more written every day。它们都使用“默认”逻辑和路径,如果请求的包位于非标准位置,则需要帮助;见CMAKE_PREFIX_PATH variable。 如果您找不到第三方图书馆的图书馆,请编写自己的图书馆代码:find_package interface guidelines for MODULE mode。确保在“覆盖”现有FindLIBX.cmake时根据需要正确设置CMAKE_MODULE_PATH以包含您的文件夹。

最终,如果您的CMakeLists.txt上有FindLIBX.cmake,则会在主CMAKE_MODULE_PATH中调用类似的内容:

SET(USE_LIBX TRUE)

if(USE_LIBX)
   find_package(LIBX QUIET)
endif()
...
add_library(my_main_lib ${sources})
...
if(LIBX_FOUND)
   target_link_libraries(my_main_lib PUBLIC ${LIBX_LIBRARIES})
   target_include_directories(my_main_lib PUBLIC ${LIBX_INCLUDE_PATH})
endif()

这里标志“USE_LIBX”使您可以轻松地打开/关闭组件的使用。 您也可以使用上述命令uncletall,但target_命令更具体,不要将库添加到所有项目目标;取决于项目的复杂程度。

和:“公共”标题将自动正确包含“私有”标题这一事实将取决于您的第三方库的编写情况。但是,私有标题永远不应该是针对您的第三方库构建的,这就是为什么它们是私有的。不同的是“依赖”标题,将包含在您的“公共”标题中。这些必然也是“公开的”,因为它们需要被移动(正确相对)到你的“公共”标题所在的位置。

答案 1 :(得分:0)

我不确定这是否是你要找的。 在此解决方案中,您有一个环境变量LIB_ROOT_DIR,它指向您的根目录。然后使用include_directorieslink_directories将目录添加到项目中。

include_directories( 
${LIB_ROOT_DIR}/Lib1
${LIB_ROOT_DIR}/Lib2/include
${LIB_ROOT_DIR}/Lib3
)
link_directories(${LIB_ROOT_DIR}/Lib1 ${LIB_ROOT_DIR}/Lib2 ${LIB_ROOT_DIR}/Lib3)