【问题标题】:CMake: How to choose which include directories get passed for each source fileCMake:如何选择为每个源文件传递哪些包含目录
【发布时间】:2019-02-01 09:04:19
【问题描述】:

我有一个包含许多源文件和头文件的项目。我可以将每个包含头文件的目录添加到 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 为每个文件使用该脚本

【问题讨论】:

  • 您可以从 CMAKE 执行脚本并将输出保存到变量中。

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


【解决方案1】:

您可以使用SET 调用如下;

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


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

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

【讨论】:

    【解决方案2】:

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

    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 时会在 directory-relevant-to-my-target 中查找头文件。我认为没有理由在源文件粒度上设置包含目录。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      相关资源
      最近更新 更多