我正在编译Linux库(为Android,使用NDK的g++,但我相信我的问题对于任何Linux系统都是有意义的)。当将这些库交付给合作伙伴时,我需要用版本号标记它们。我还必须能够以编程方式访问版本号(例如在“关于”对话框或GetVersion
函数中显示它)。
我首先使用未带版本号的标志(版本0.0
)编译库,在将其发送给合作伙伴之前需要将此版本更改为真实版本。我知道修改源代码并重新编译会更容易,但我们不想这样做(因为如果重新编译代码,我们应该再次测试一切,我们觉得这样会少出错,请参见本帖子的注释,最后是因为我们的开发环境是这样工作的:对于Windows二进制文件,我们设置一个0.0
资源版本字符串(.rc),然后我们稍后使用verpatch来更改它...我们希望在发货Linux二进制文件时采用同样的过程)。
在这里,什么是最好的策略?总结要求如下:
- 使用“未设置”的版本(
0.0
或其他任何版本)编译二进制文件 - 能够在不重新编译二进制文件的情况下将此“未设置”的版本修改为特定版本(理想情况下,运行第三方工具命令,就像我们在Windows下使用verpatch一样)
- 能够使库代码在运行时检索其版本信息
如果您的答案是“重命名.so文件”,那么请提供第3个问题的解决方案:如何在运行时检索版本名称(即:文件名)。
我想到了一些方法,但不知道它们是否可行以及如何实现它们。
- 在代码中有一个版本变量(一个
string
或3个int
),并有一种方法可以稍后在二进制文件中更改它吗?使用二进制sed...? - 在资源中加入一个版本变量,并在二进制文件后期更改它的方式(就像我们对win32/win64做的那样)。
- 使用.so文件的一个字段(例如SONAME)专门用于此目的,并有一个工具可以更改它...并且从C++代码中访问它。
- 重命名库+更改SONAME(没有找到如何实现)...并找到一种从C++代码中检索它的方法。
- ...
请注意,我们使用QtCreator来编译Android .so文件,但它们可能不依赖于Qt。因此,使用Qt资源不是理想的解决方案。