【发布时间】:2019-04-11 14:23:17
【问题描述】:
在开发仅包含标头的库时,我想确保给定的字符串嵌入到使用我的标头的所有二进制文件中,即使编译器被配置为优化掉未使用的常量,并且二进制文件被剥离。
嵌入不应有任何副作用(除了使生成的二进制文件更大一点)。
我不知道人们会如何使用标题,但是
- 头文件可能包含在多个编译单元中,所有编译单元都链接到一个二进制文件中
- 目标平台是 Linux/macOS/Windows
- 编译器很可能是 gcc/clang/MSVC
我的微不足道的尝试相当于:
static char frobnozzel_version_string[] = "Frobnozzel v0.1; © 2019 ACME; GPLv3";
...,但是在构建过程中很容易删除它(因为字符串实际上并没有被使用,它很容易成为优化编译器的牺牲品)。
所以问题是:是否可以在包含给定标头的任何二进制文件中嵌入一个字符串,该字符串不会被构建“发布”二进制文件的常规策略优化/剥离?
我知道,使用该库的任何人都可以(手动)删除我放入的任何内容,但我们假设,人们只是“按原样”使用标题。
上下文:有问题的标头在GPL 下发布,我希望能够检查用户是否真的遵守了许可。
【问题讨论】:
-
宏可用于此。
-
使用
volatile限定符en.cppreference.com/w/cpp/language/cv -
@sturcotte06 怎么样?
-
通常,项目有一个
version.h.in,它是从构建系统配置的,带有一堆定义,例如#define FROBNOZZEL_VERSION "@PROJECT_VERSION@"和#define FROBNOZZEL_LICENSE "@PROJECT_LICENSE@" -
@umläute:“我不认为这是一个大问题”如果整个项目的源代码适合一个屏幕,那么它可能不是大问题。如果 3 个人以上在一个相当大的代码库上工作,这将成为一个大问题。
标签: c compiler-optimization copyright-display