c++ - CMake/make 在头文件上应用 -D 标志
问题描述
我正在(交叉)编译一个支持许多不同平台的共享 C 库,该库由 CMakeLists 文件的层次结构处理。在这些文件中,有条件地生成了几个特定于平台的编译器标志(带有add_definitions()
)。我可以成功编译源代码并将其链接到适当的 .so 文件。
但是要在任何项目中使用该库,我也需要提供正确的头文件。CMake的以下install
命令选择要复制的正确头文件,但不应用预处理器定义/包含的替换:
install(FILES ${headers} DESTINATION include/mylibrary)
那么如何生成/安装“后编译”头文件呢?
到目前为止我的想法:
- 应该将我
add_definitions()
的 -D 堆叠在 COMPILE_DEFINITIONS 变量中,也许foreach
在复制的原始标头上运行循环并替换定义/包含占位符? - 使用
add_custom_command()
在复制之前应用一些逻辑?
编辑:正如 Tsyvarev 所指出的,这里有一个非常接近我需要的答案,但不幸的是并不完全如此。总之,答案提供了 2 个选项:
- 在所有库的标头中包含一个特殊的“配置”标头,并利用 cmakedefine 命令调用
configure_file()
此标头。我不能使用这种方法,因为我不想更改库头。 - 创建一个特定于目标的 .cmake 文件,该文件可帮助外部项目包含正确的标头以及所有必要的 -D 定义。我也不能使用这种方法,因为我的外部项目不使用 cmake 进行构建。另外,我希望创建一个尽可能容易包含的库。
还有其他想法吗?
编辑 2:我可能需要详细说明我的声明,即install
CMake 的命令不会取代定义。举个例子:
//sampleheader.hpp
#ifndef SAMPLEHEADER_HPP_
#define SAMPLEHEADER_HPP_
#include OS_SPECIFIC_HEADER
//...
现在我有一个 CMakeLists.txt 文件,它执行以下操作:
# ...
if (${OS} MATCHES "arm-emblinux")
add_definitions(-DOS_SPECIFIC_HEADER="emblinuxHeader.hpp")
elseif (${OS} MATCHES "linux")
add_definitions(-DOS_SPECIFIC_HEADER="linuxHeader.hpp")
endif()
# ...
一切都编译得很好,但是当install
上面的命令被调用时,我的 ../include/ 目录中有一个头文件,其中仍然包含 OS_SPECIFIC_HEADER 占位符。当然,这不能正确地包含在任何开发项目中。
解决方案
推荐阅读
- c# - DirectoryInfo 的 GetFiles 未显示目录中的实际内容
- bash - bash shell 附加到变量的挫败感
- c# - 如何在使用 Host.CreateDefaultBuilder 安装的 Web 主机中配置日志记录
- javascript - 如何在 vue.js 中对计算属性进行排序
- python - 根据条件从嵌套列表中删除某些子列表
- java - 如何从主页(jsoup)中获取特定数据,用于稍后的 if 子句(Java,Eclipse)
- html - 下拉菜单未出现
- excel - 在用户窗体中创建循环
- java - 如何从 ion 返回全局变量?
- c# - 如何在不使用 .NETCore 的情况下将 JSON 配置文件正确连接到项目