在CMake中指定显式头文件
Specify explicit header files in CMake
我已经预编译了头文件stdafx.h,这是特定于每个目标。我的CMake项目大致如下所示:
include_directories(<prefix>/include_a)
include_directories(<prefix>/include_b) #<---- contains stdafx.h that should NOT be used
include_directories(<project_dir>/) #<----- contains stdafx.h that should be used
add_executable(<project_name> <sources>)
问题:我想排除作为<prefix>/include_b
目录一部分的预编译头。如果不可能,那么显式地指定头文件。我知道gcc
支持-include
选项,但CMake是否有更干净的选项符合我的要求?
把我的评论变成答案
如果你不想强制包含文件(这不是CMake明确支持的),我认为答案在于你的包含路径的顺序。
首先这里是我用来重现你的问题的测试代码:
cmake_minimum_required(VERSION 3.0)
project(IncDirOrder)
file(WRITE "prefix/include_a/stdafx.h" "#error include_a/stdafx.h")
file(WRITE "prefix/include_b/stdafx.h" "#error include_b/stdafx.h")
file(WRITE "include/stdafx.h" "")
file(WRITE "main.cpp" "#include "stdafx.h"nint main() { return 0; }")
include_directories(prefix/include_a)
include_directories(prefix/include_b)
include_directories(include)
add_executable(${PROJECT_NAME} main.cpp)
影响包含路径顺序的可能解决方案
重新排序
include_directories()
调用(如果可能):include_directories(include) include_directories(prefix/include_a) include_directories(prefix/include_b)
BEFORE
关键词的使用:include_directories(BEFORE include)
或
target_include_directories(${PROJECT_NAME} BEFORE PUBLIC include)
假设其他预编译的头文件也附带一个库,我通常建议使用
target_include_directories()
。然后,您将自动获得所需的行为(本地包含确实优先于接口包含):cmake_minimum_required(VERSION 3.0) project(IncDirOrderWithLibs) file(WRITE "prefix/source_a/stdafx.cpp" "#define LibAn#include "stdafx.h"") file(WRITE "prefix/include_a/stdafx.h" "#ifndef LibAn#error include_a/stdafx.hn#endif") file(WRITE "prefix/source_b/stdafx.cpp" "#define LibBn#include "stdafx.h"") file(WRITE "prefix/include_b/stdafx.h" "#ifndef LibBn#error include_b/stdafx.hn#endif") file(WRITE "include/stdafx.h" "") file(WRITE "main.cpp" "#include "stdafx.h"nint main() { return 0; }") add_library(LibA "prefix/source_a/stdafx.cpp") target_include_directories(LibA PUBLIC prefix/include_a) add_library(LibB "prefix/source_b/stdafx.cpp") target_link_libraries(LibB LibA) target_include_directories(LibB PUBLIC prefix/include_b) add_executable(${PROJECT_NAME} main.cpp) target_link_libraries(${PROJECT_NAME} LibB) target_include_directories(${PROJECT_NAME} PRIVATE include)
引用
- Cmake设置变量是递归的吗?
- CMake Build System: Transitive Usage Requirements
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何使用CMake编译.proto文件来生成.grpcp.pb.cc和.grpc.pb.h文件
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 现代CMake(3.8+)-FindCUDA已弃用,非.cu文件呢
- 如何通过Conan和CMake找到用于pkg配置的.pc文件
- MinGw 无法从 cmake 编译测试文件
- cmake:添加要搜索头文件的目录
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 使用 Makefile 中的头文件编译 Pybind (不使用 cmake)
- CMake:在其他目录中找不到我的头文件
- 在Cmake构建CmakeList.txt中读取/解析XML文件
- 无法使用 CMake 从其他文件夹添加源文件
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 使用 Cmake 在 Qt Creator 中显示头文件
- CMake 生成的 MSVC 项目找不到符号,即使为其相关 dll 正确生成了 lib 文件也是如此
- 告诉CMake链接到自定义文件夹中的Boost
- Vcpkg Pango CMake 构建失败缺少头文件
- 从不同的文件cmake调用类