CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
CMake: Can we specify include directories for a specific set of files not forming an executable or lib?
如果我有这个源代码树:
C:app:
src:
CMakeLists.txt
main.cpp --> #include "acme/header_only_lib/api.h"
D:3rdpartyacmeheader_only_lib:
api.h --> #include "detail.h"
detail.h
不使用符号链接技巧,也不向第三方文件夹添加文件,如果我必须在main.cpp
中保留#include "acme/header_only_lib/api.h"
,我应该如何在 CMake 中指定包含目录,以便api.h
可以看到detail.h
,而不添加D:3rdpartyacmeheader_only_lib
的全局包含目录?仅标头库不是可执行文件也不是库目标,其代码无法由我修改。我也不想通过添加D:3rdpartyacmeheader_only_lib
来污染我的全局包含目录,因为里面的文件名太常见了,很容易与其他库/未来的代码发生冲突。
有没有CMake机制,我可以说:仅对于D:3rdpartyacmeheader_only_libapi.h
,添加D:3rdpartyacmeheader_only_lib
作为包含目录?
要将目录添加到包含目录的全局列表中,请使用例如
include_directories( ${CMAKE_SOURCE_DIR}/3rdparty )
请注意,不应将绝对路径(如D:
(硬编码到 CMakeList 中.txt因为这会使无法在任何其他位置生成项目。CMake 为此目的提供了${CMAKE_SOURCE_DIR}
和${CMAKE_BINARY_DIR}
等变量。
如果您只想将目录添加到构建特定部分的包含目录列表中,则可以使用
target_include_directories( app PRIVATE ${CMAKE_SOURCE_DIR}/3rdparty )
这将仅添加目标(可执行文件/库(app
的目录。
请注意,如果您的acme/header_only_lib
应该与app
二进制文件一起安装,则此方法将不起作用,因为您的 acme 标头需要在客户端计算机上"看到"彼此,如果它们驻留在acme/header_only_lib
子目录中但彼此寻址而不使用子目录,则不太可能。这将要求你的客户端(他没有使用你的CMakeLists.txt
进行构建(向包含路径添加acme/header_only_lib
,以便你的头库工作 - 你不应该这样做。
使用include_directories
或target_include_directories
:
include_directories("D:3rdparty")
如果只想对main
目标进行此更改,则与target_include_directories
一起或:
add_executable(main main.cpp)
target_include_directories(main PUBLIC "D:3rdparty")
然后你可以#include "acme/header_only_lib/api.h"
或#include <acme/header_only_lib/api.h>
仅标头库
如果您只想为header-only-lib
执行此操作,则需要在其 CMake 文件中执行此操作。首先将库添加为没有源文件的INTERFACE
:
add_library(header-only INTERFACE)
然后包括它的目录:
target_include_directories(header-only INTERFACE include-dir-for-header-only)
然后将其链接到主目标
find_library(HeaderOnly
NAMES header-only
HINTS "D:3rdpartypath-to-lib"
)
target_link_libraries(main header-only)
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 应使用 CMake install 命令将可执行资源文件安装到何处?
- 为什么当我们想要运行可执行的 c++ 文件时,我们需要在可执行的 c++ 文件前面"./"?
- 如何告诉 clang 将调试符号放入可执行二进制文件中
- 从 Web UI 访问C++编译的可执行二进制文件
- 使C可执行/设置文件在任何计算机上运行
- 不是可执行格式:文件格式无法识别 GDB
- 如何制作不依赖于 .so 文件的可执行二进制文件
- 可执行测试文件没有运行测试
- 系统()调用批处理可执行流文件使程序在windows上重置