CMake:如何选择为每个源文件传递哪些包含目录
CMake: How to choose which include directories get passed for each source file
我有一个包含许多源文件和头文件的项目。我可以将包含头文件的每个目录添加到 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 为每个文件使用该脚本
您可以像下面这样使用SET
调用;
set(HEADERS h1.h h2.h h3.h)
set(CPP_SOURCE myfunc.cpp)
add_executable(prog ${HEADERS} ${SOURCE_FILES} )
PS: 最好查看文件层次结构,因为通常你应该只使用 include_directories
调用。
通常情况下,您应该在目标级别而非全局设置包含目录:
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 固有的可移植性.
我有一个包含许多源文件和头文件的项目。我可以将包含头文件的每个目录添加到 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 为每个文件使用该脚本
您可以像下面这样使用SET
调用;
set(HEADERS h1.h h2.h h3.h)
set(CPP_SOURCE myfunc.cpp)
add_executable(prog ${HEADERS} ${SOURCE_FILES} )
PS: 最好查看文件层次结构,因为通常你应该只使用 include_directories
调用。
通常情况下,您应该在目标级别而非全局设置包含目录:
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 固有的可移植性.