c - 使用clang而不是gcc链接成功(Debian Bullseye amd64上的-llzma)
问题描述
在 Debian Bullseye(测试)上,安装了这些与 xz/lzma 相关的软件包:
ii liblzma-dev:amd64 5.2.4-1+b1 amd64 ii liblzma5:amd64 5.2.4-1+b1 amd64 ii lzma-dev 9.22-2.1 全部
Clang 生成一个./a.out
没有问题的工作:
$>gunzip < /usr/share/doc/liblzma-dev/examples/02_decompress.c.gz | sed -s 's/extern int/int' | clang -std=c18 -Wall -Wextra -x c -llzma -
但是,尝试使用 gcc 失败:
$>gunzip < /usr/share/doc/liblzma-dev/examples/02_decompress.c.gz | sed -s 's/extern int/int' | gcc -std=c18 -Wall -Wextra -x c -llzma -
/usr/bin/ld: /tmp/ccl8uTG0.o: in function `init_decoder':
:(.text+0x20): undefined reference to `lzma_stream_decoder'
/usr/bin/ld: /tmp/ccl8uTG0.o: in function `decompress':
:(.text+0x1e1): undefined reference to `lzma_code'
/usr/bin/ld: /tmp/ccl8uTG0.o: in fuction `main':
:(.text+0x4e4): undefined reference to `lzma_end'
collect2: error: ld returned 1 exit status
g++ --version
报告9.3.0-3
clang++ --version
报告9.0.1-10
(这些编译器都是通过安装的apt-get
。)
/etc/ld.so.conf.d/x86_64-linux-gnu.conf
包含
# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
我已经检查过/usr/lib/x86_64-linux-gnu/liblzma.so.5.2.4
(以及它的.so.5
和.so
符号链接,以及相关的 .a 文件)是否存在。
此外, 的输出readelf --symbols /usr/lib/x86_64-linux-gnu/liblzma.so.5.2.4 | grep 'lzma_[sec]'
显示这三个符号存在(以及许多其他符号):
67: 000000000000c720 106 FUNC 全局默认值 13 lzma_stream_decoder@@XZ_5.0 108: 00000000000039d0 701 功能全球默认值 13 lzma_code@@XZ_5.0 117:0000000000003c90 65 功能全局默认值 13 lzma_end@@XZ_5.0
我究竟做错了什么?
解决方案
Clang 将链接器命令行区域的-llzma
外部:--as-needed
[…] -L/usr/lib -llzma /tmp/--e00a22.o -lgcc --as-needed -lgcc_s […]
GCC 把它放在后面--as-needed
:
[…] --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 […]
-llzma /tmp/ccAZHRvb.o -lgcc --push-state
结果,链接器-llzma
会在命令行中注意到此时不需要的内容并将其删除。链接是顺序敏感的。
正如HolyBlackCat建议的那样,您可以通过使用- -llzma
而不是来解决此问题。-llzma -
推荐阅读
- sql - 在 Postgresql 中与 RETURNING 一起使用时,WITH 返回表的行为异常?
- firebase - 有没有办法在 Kotlin Multiplatform 中使用 Firebase(身份验证)?
- python - 如何重写多标题的代码
- raku - Raku:如何为 CArray[WCHAR] 赋值?
- sql - 有没有办法引用前一行的计算值并在下一行的计算中使用它?
- php - WooCommerce 结帐页面上使用多个复选框的条件电子邮件收件人?
- javascript - 更新部署
- c++ - 为什么在即时窗口中执行 iterator->end() 会导致读取访问冲突,即使迭代器在范围内 - 对于 C++ vector::iterator?
- ios - 如何让 Expo 提示我的应用获得“始终”位置权限?
- angular - ng build --prod 没有反映 Angular 8 的新变化