cmake并包含跨项目的目录

时间:2016-07-10 17:31:14

标签: gcc cmake

我试图将一个大型的cmake管理项目拆分成一个较小项目的集合。我无法让cmake接受包含目录的传播。我目前正在使用ubuntu 14.04(2.8)附带的cmake版本。如果确实有必要,我可以切换到3.x,但如果我能帮助它,我宁可不要。

考虑一个示例,其中源树的某个目录由可分离的,可隔离的库组成。它在我的源代码树中没有其他依赖项,到目前为止已由

组合管理
ADD_SUBDIRECTORY(smdir)

并在smdir内:

ADD_LIBRARY(something STATIC something.c something.h)

something用作依赖关系的其他区域中,以下内容完美无缺:

ADD_LIBRARY(something_else STATIC ...)
TARGET_LINK_LIBRARIES(something_else something)

所有这些都发生在进行其他名称修改的cmake宏/函数中,所以如果此处列出的精确代码略有不正确,请原谅我。

我现在要做的是将something完全从我的源代码树中拉出来。我应该注意,这些是用于裸机微控制器的嵌入式库,并不是我在构建机器上安装的东西。

something的基本编译脚本与预期的工作非常相似,只需要很少的更改。我将此(现在是外部编译和管理的)库与代码库的其余部分集成的方法是从构建树导出已编译的库,并将其导入到我的其他项目中。此方法主要基于https://cmake.org/Wiki/CMake/Tutorials/Exporting_and_Importing_TargetsExporting from a Build Tree部分。我试图通过以下方式做到这一点:

TARGET_INCLUDE_DIRECTORIES(something PUBLIC /path/to/smdir/src)
EXPORT(TARGETS something FILE something-config.cmake)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/something-config.cmake 
            DESTINATION ${PLATFORM_PACKAGES_PATH})

其中$ {PLATFORM_PACKAGES_PATH}是我打算收集所有这些配置文件的系统文件夹。生成的配置文件看起来很合理,并且安装到正确的位置就好了,并且有以下几行(以及许多其他行):

add_library(something STATIC IMPORTED)
set_target_properties(something PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "/path/to/smdir/src"
)
set_property(TARGET something APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
set_target_properties(something PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELWITHDEBINFO "C" IMPORTED_LOCATION_RELWITHDEBINFO "/correct/path/to/something.a")

导入此库时出现问题,我使用它:

ADD_LIBRARY(something STATIC IMPORTED)
SET_PROPERTY(TARGET something PROPERTY IMPORTED_LOCATION "${PLATFORM_PACKAGES_PATH}") 
GET_PROPERTY(public_include_dirs TARGET something PROPERTY INTERFACE_INCLUDE_DIRECTORIES)

任何列出某些内容作为依赖项的库的构建都不包含gcc命令中某些内容的INCLUDE_FOLDERS。我尝试使用GET_PROPERTY读取的public_include_dirs变量为空。

非常感谢任何帮助或见解,包括对清洁工的建议。或更好的方法。

1 个答案:

答案 0 :(得分:1)

如果您完全解压缩模块,那么从导入项目的角度来看,您已经有效地创建了第三方库。

因此,如果您已经导出cmake包/配置脚本,为什么不使用find_package()正常导入它们。无论您使用-DCMAKE_PREFIX_PATH最初安装了已解压缩的库,将-DCMAKE_INSTALL_PREFIX移至相同位置。

总结一下:

  1. 在您提取的库上调用cmake时传递-DCMAKE_INSTALL_PREFIX=/path/to/target/prefixmake && make install它。
  2. 使用find_package()重新构建导入项目中的cmake逻辑。
  3. 按照正常情况使用库target_link_libraries()为您提取的库提取参考。
  4. 在导入项目中调用cmake时传递-DCMAKE_PREFIX_PATH=/path/to/target/prefix。然后make它。
相关问题