CMake configure_file不包含在静态库中
CMake configure_file not being included in static library
目录结构如下:
project
| ...
| CMakeLists.txt
| - build/
| - bench/
| libbench_main.a // static library containing symbols
| foo.h
| - bench/
| - bench_main.cc
| - CMakeLists.txt
| - foo.h.in
我想include foo.h
libbench_main.a
// project/bench/bench_main.cc
#include "foo.h"
...
// project/bench/foo.h.in
#cmakedefine01 BAR
因此,据我了解,预期的结果是,如果我在构建libbench_main.a后对其进行nm
,我应该看到BAR
符号。
而言,CMake对我来说似乎也很简单:
// project/bench/CMakeLists.txt
...
set(BAR FALSE)
configure_file(foo.h.in foo.h @ONLY)
add_library(bench_main STATIC bench_main.cc foo.h)
target_include_directories(bench_main PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
...
右?所以我配置文件,在我运行cmake -GNinja ..
后project/build
得到这个:
// project/build/bench/foo.h
#define BAR 0
一切都如预期的那样。但是,当我在project/build
中运行ninja bench/libbench_main.a
并实际构建它时,没有错误,但是nm
-ing project/build/bench/libbench_main.a
显示该符号不存在。我不知道这么简单的一组命令怎么会不包含它 - 在 CMake 中很明显,它应该被添加。我应该补充一点,这是一个干净的build
目录,所以这不是问题。
这是在 Ubuntu 上,如果这有任何区别,CMake 版本 3.12。
#define BAR 0
是一个C预处理器指令,因此不定义任何符号。您需要显式使用此定义。例如:const extern bool bar(BAR);
在您的bench_main.cc
中。如果您将CMakeLists.txt
中的行更改为 set(BAR false)
(小写 false(,也可以直接在 foo.h.in
中定义为bool bar = @BAR@;
。只需记住使用全局变量时的 ODR。
此外,无需在add_library(bench_main STATIC bench_main.cc)
中包含标题
相关文章:
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 如果函数包含静态变量,为什么编译器不执行内联?
- 拒绝包含某些公共静态数据成员的类型
- 包含不同大小静态数组的类的多个实例
- 扩展包含静态函数的类
- 是否可以链接到,包括和使用静态库,而无需额外包含标头/文件
- C++类方法包含对静态变量的未定义引用
- 仅在满足静态constexpr时才包含代码
- 如果标头包含在另一个标头中,但不包含 CPP,则静态断言
- CMake configure_file不包含在静态库中
- 在 ONE 设置中添加附加包含目录并引用 => 指向静态库
- 将"reference"点添加到静态库项目:仍然需要包含目录
- 包含多态对象的向量:静态断言误差
- 如何静态构建并在Windows上包含WolfSSL
- 静态初始化包含功能指针的对象的constexpr std ::数组
- 是否可以存储一个在静态容器中包含unique_ptr的对象
- 创建一个静态包含ffmpeg的共享库