【发布时间】:2012-09-15 16:58:43
【问题描述】:
我们有大量 C++ 项目(GCC、Linux,主要是静态库),它们之间存在许多依赖关系。然后我们使用这些库编译一个可执行文件并在前端部署二进制文件。能够识别该二进制文件将非常有用。理想情况下,我们希望有一个小脚本,可以直接从二进制文件中检索以下信息:
$ident binary
$binary : Product=PRODUCT_NAME;Version=0.0.1;Build=xxx;User=xxx...
$ dependency: Product=PRODUCT_NAME1;Version=0.1.1;Build=xxx;User=xxx...
$ dependency: Product=PRODUCT_NAME2;Version=1.0.1;Build=xxx;User=xxx...
因此它应该显示二进制文件本身及其所有依赖项的所有信息。
目前我们的做法是:
在编译每个产品的过程中,我们生成 Manifest.h 和 Manifest.cpp,然后将 Manifest.o 注入二进制文件
ident 脚本解析目标二进制文件,在那里找到生成的内容并打印此信息
但是,对于不同版本的 gcc,这种方法并不总是可靠的。 我想问问 SO 社区 - 有没有更好的方法来解决这个问题?
感谢您的建议
【问题讨论】:
-
我们正在做类似的事情,但是我们添加了一些 API 以允许在中心位置注册版本信息,这样我们不仅可以通过 ident 检索它,还可以通过一些 API 调用来显示它在应用程序本身。所以,总的来说,我会说你的方法是合理的;)你观察到的确切问题是什么?
-
@Andreas。谢谢。问题只发生在一个平台上(Linux x86,gcc 4.1.2) - 由于某种原因,编译的二进制清单不存在(可能因为没有引用或一些棘手的修改而优化)。我们对此有一个解决方法(我们使用古老的编译器编译 Manifest.o),但我感觉我们做了一些 hack。
-
您能否只添加一个命令行参数,使可执行文件将版本信息转储到标准输出以供脚本抓取?
-
@JonathanPotter:谢谢,但这是如何将版本信息(包括所有部门)放入可执行文件的主要问题。你建议如何处理这个问题?是的,“命令行方法”简化了信息的输出,但仅适用于可执行文件,并且需要将相同的代码插入到每个可执行文件中,这更具侵入性
-
可能链接的依赖项是已知的并且不会经常更改,因此只需让每个依赖项导出一个提供其版本号的函数,并让 exe 调用所有这些并将它们串在一起.
标签: c++ gcc binary manifest identity