如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库

Posted

技术标签:

【中文标题】如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库【英文标题】:How to make cmake pass D argument to ar for reproducible build of a static library 【发布时间】:2021-06-02 09:21:14 【问题描述】:

我的项目使用 CMake 从相同的 C++ 代码构建静态和动态库。动态库文件 (.so) 在重建时保持不变,但静态库文件 (.a) 在每次重建时都会更改。我已经明白这是因为 ar 工具的行为,我需要传递 D 参数来创建确定性输出。

我在我的机器上找到了一个 cmake 变量CMAKE_AR,它指向/usr/bin/ar。编译输出显示执行的命令为:/usr/bin/ar qc libfoo.a file1.o file2.o ...

根据ar 文档,我应该将上述调用更改为/usr/bin/ar qcD ... 以获得确定性输出。

如何使用 CMake 完成此任务?

我在 Linux 上,需要与 CMake >= v3.11 兼容的解决方案

【问题讨论】:

您可以将其他选项添加到 CMAKE_STATIC_LINKER_FLAGS 变量中,例如set(CMAKE_STATIC_LINKER_FLAGS "$CMAKE_STATIC_LINKER_FLAGS D") @vre 那行不通。结果是:/usr/bin/ar qc libfoo.a D file1.o file2.o .... 这个问题提供了额外的信息和一个可能的解决方案***.com/questions/62339192/… @vre 非常感谢该链接。尽管其中的方法不太奏效,但有一个指向 CMake git repo 的链接有所帮助。 set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcD <TARGET> <LINK_FLAGS> <OBJECTS>") 似乎可以解决问题 【参考方案1】:

以下工作为arranlib 设置参数以生成确定性静态库输出文件:

set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> qcD <TARGET> <LINK_FLAGS> <OBJECTS>")
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -D <TARGET>")

【讨论】:

以上是关于如何使 cmake 将 D 参数传递给 ar 以可重现地构建静态库的主要内容,如果未能解决你的问题,请参考以下文章

使用特定链接器进行CMake交叉编译不会将参数传递给armlink

如何将不同的参数传递给片段 [导航] Android

如何将参数传递给 Java 线程?

如何将参数传递给 PhoneGap 数据库事务函数

如何阻止CMake将特定于平台的标志传递给编译器?

如何将关键字对作为参数传递给函数中的模块?