GNU 工具链编译出来的 libbotan-2.a 形同虚设,无法用于静态链接

2022-12-02 17:07:33 +08:00
 cnbatch
我在“宽带症候群”发了个试验品相关的帖子 /t/898299

这个试验品用到了 Botan2 这个库,原本我是打算全部都用静态编译的,FreeBSD (用 clang )和 Windows (用 MSVC )都成功了,偏偏 Linux (用 GCC )和 NetBSD (也是 GCC )就失败。其他人同样尝试过在 musl 下静态编译,一样失败:
https://github.com/cnbatch/udphop/issues/3

其中 Windows 平台用的是 vcpkg 安装 Botan2 ,FreeBSD 、NetBSD 和 Linux 都用自带的包管理器安装。

于是几天前发布的 Linux 版本二进制文件都是动态编译,分了 3 个版本:Fedora 最新的 Botan 2.19.3 、Debian 10 的 Botan 2.9 、Debian 11 的 Botan 2.17

结果 musl 用户就无法用了。

我给 Botan 的作者提了个 Issue ,问他怎样才能成功地使用 libbotan-2.a 做静态编译
https://github.com/randombit/botan/issues/3085
得到的回答是,用动态编译就能够编译成功

这不就死循环无解了嘛

还好,Botan 的作者还有另外一个解决办法,那就是生成 botan_all.h 和 botan_all.cpp ,直接 #include 起来

唯一缺点就是生成的二进制文件过于巨大

在使用 botan_all.h 和 botan_all.cpp 之前我还尝试过在 Linux 安装 clang 13 ,并指定用 clang 编译项目,结果仍然一样,libbotan-2.a 无法用于静态编译

这也难怪 Fedora 版本(我在 rawhide 看到的)的 Botan2 及 devel 版本都不附带 libbotan-2.a ,这样就可以无条件使用动态链接库版本,避免编译失败


是否还有其他办法可以在 GNU 工具链下用 libbotan-2.a 做静态链接?
2450 次点击
所在节点    C++
21 条回复
cnbatch
2022-12-04 21:33:11 +08:00
@pagxir
@ec0

好了,这下搞清楚原因在哪了,确实是 GCC 的锅。
我在 Debian 测试版运行了一次 apt upgrade ,把所有能够更新的都更新一遍,其中就包括 GCC 。我记得应该有两个月没更新过了。

升级完成后,原本 GCC 10 会失败的命令
c++ aes.cpp -I./include/botan-2 -lstdc++ -L:./lib/ -lbotan-2 -static
在最新版 GCC 12.2.0-9 一次性成功

至于是什么 bug 就懒得查了。我只能说,GCC 真不是省油的灯。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/899654

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX