我正在尝试学习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中的私有标头依赖项和子文件夹(我只想包含顶级标题,并且必须找到包含它们相对路径的所有较低级别标题)
如何实现这些目标?
答案 0 :(得分:2)
任何具有任何libs目录结构的人使用
不会开箱即用。最后,您需要所有第三方库的路径,无论它们位于公共根目录还是单独的目录中。在任何情况下,至少需要XX_INCLUDE_PATH
和XX_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_directories
和link_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)