为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用CMake正确添加包含目录

如何使用CMake正确添加包含目录

C++
守候你守候我 2019-09-18 14:40:01
大约一年前,我询问了CMake中的头依赖关系。我最近意识到问题似乎是CMake认为那些头文件是项目外部的。至少,在生成Code :: Blocks项目时,头文件不会出现在项目中(源文件会出现)。因此,在我看来,CMake认为这些标题是项目的外部,并且不会在依赖项中跟踪它们。在CMake教程中快速搜索只指出include_directories哪个似乎没有我想做的...向CMake发出信号通知特定目录是否包含要包含的标头的正确方法是什么,以及生成的Makefile是否应该跟踪这些标头?
查看完整描述

3 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

必须做两件事。


首先添加要包含的目录:


target_include_directories(test PRIVATE ${YOUR_DIRECTORY})

如果您在没有支持的情况下遇到非常旧的CMake版本(2.8.10或更早版本)target_include_directories,您也可以使用旧版include_directories:


include_directories(${YOUR_DIRECTORY})

然后,您还必须将头文件添加到当前目标的源文件列表中,例如:


set(SOURCES file.cpp file2.cpp ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)

add_executable(test ${SOURCES})

这样,头文件将在Makefile中显示为依赖项,例如在生成的Visual Studio项目中,如果生成一个。


如何将这些头文件用于多个目标:


set(HEADER_FILES ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)


add_library(mylib libsrc.cpp ${HEADER_FILES})

target_include_directories(mylib PRIVATE ${YOUR_DIRECTORY})

add_executable(myexec execfile.cpp ${HEADER_FILES})

target_include_directories(myexec PRIVATE ${YOUR_DIRECTORY})


查看完整回答
反对 回复 2019-09-18
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

如果将CMake与其他创建Makefile的方法(例如make或qmake)进行比较,则CMake更像是一种脚本语言。它不像Python那么酷,但仍然如此。


如果在各种开源项目中查看人们如何包含目录,就没有像“ 正确的方法 ” 这样的东西。但有两种方法可以做到这一点。


粗体include_directories会将目录附加到当前项目以及您将通过一系列add_subdirectory命令追加的所有其他后代项目。有时人们会说这种做法是遗留的。


更优雅的方法是使用target_include_directories。它允许为特定项目/目标附加目录,而不会(可能)不必要的继承或各种包含目录的冲突。还允许执行甚至是微妙的配置,并为此命令附加以下标记之一。


PRIVATE - 仅用于此指定的构建目标


PUBLIC - 将其用于指定目标和与此项目链接的目标


接口 - 仅用于与当前项目链接的目标


PS:


这两个命令都允许将目录标记为SYSTEM,以提示指示目录将包含警告不是您的业务。


类似的答案是其他命令对target_compile_definitions / add_definitions, target_compile_options / CMAKE_C_FLAGS


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 12023 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信