CMake:如何选择要为每个源文件传递哪些包含目录

时间:2018-08-26 17:58:06

标签: c++ command-line cmake g++ include-path

我有一个包含许多源文件和头文件的项目。我可以将包含头文件的每个目录添加到CMake的包含目录中,以便通过-I选项将其传递到每个源文件的编译中。

include_directories(I/will/need/tons/of/these);

通过CMake,有什么办法只能将相关的包含目录传递给每个源文件的编译吗?

例如,如果我是在命令行上自己编写的,那么我将使用如下脚本:

g++ -I $(./get_include_dirs.sh foo.cpp) -o foo.o foo.cpp

其中$(./ get_include_dirs.sh foo.cpp)是一个脚本,仅可扩展为foo.cpp的包含目录

这可以在CMake上完成吗?我不知道如何告诉cmake为每个文件使用该脚本

2 个答案:

答案 0 :(得分:0)

您可以像下面这样使用SET通话;

set(HEADERS h1.h h2.h h3.h) 
set(CPP_SOURCE myfunc.cpp)


add_executable(prog ${HEADERS} ${SOURCE_FILES} )

PS:最好检查文件层次结构,因为通常应该只使用include_directories调用。

答案 1 :(得分:0)

通常,您应该设置包含目录,而不是全局的,而是在目标级别:

set(my-target-sources
  source1.cpp
  ...
  sourceN.cpp
)
add_library(my-target
  ${my-target-sources}
)
target_include_directories(my-target
  [PUBLIC|PRIVATE|INTERFACE]
    directory-relevant-to-my-target
)

这样,编译器将在编译my-target时在与my-target相关的目录中查找头文件。我认为没有理由在源文件粒度上设置包含目录。

要从CMake执行脚本,可以使用execute_process并在OUTPUT_VARIABLE参数中收集目录列表,但我不建议这样做,因为这样做会失去CMake固有的可移植性。