我试图将一个大型的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_Targets的Exporting 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
变量为空。
非常感谢任何帮助或见解,包括对清洁工的建议。或更好的方法。
答案 0 :(得分:1)
如果您完全解压缩模块,那么从导入项目的角度来看,您已经有效地创建了第三方库。
因此,如果您已经导出cmake
包/配置脚本,为什么不使用find_package()
正常导入它们。无论您使用-DCMAKE_PREFIX_PATH
最初安装了已解压缩的库,将-DCMAKE_INSTALL_PREFIX
移至相同位置。
总结一下:
-DCMAKE_INSTALL_PREFIX=/path/to/target/prefix
。 make && make install
它。find_package()
重新构建导入项目中的cmake逻辑。target_link_libraries()
为您提取的库提取参考。-DCMAKE_PREFIX_PATH=/path/to/target/prefix
。然后make
它。