无法静态链接libcurl且动态链接其依赖库问题
静态链接libcurl但动态链接其依赖库时的链接错误问题
在Ubuntu Noble容器中,尝试通过curl-config --static-libs实现静态链接libcurl、动态链接其所有依赖库,但编译时链接器报错无法找到多个依赖库。以下是详细操作及错误信息:
1. 查看静态链接参数
执行curl-config --static-libs获取静态链接所需参数:
root@74c0362a3530:/# curl-config --static-libs -Wl,-Bstatic -lcurl -Wl,-Bdynamic -lnghttp2 -lidn2 -lrtmp -lssh -lssh -lpsl -lssl -lcrypto -lssl -lcrypto -lgssapi_krb5 -llber -lldap -llber -lzstd -lbrotlidec -lz
2. 编译命令及链接错误
执行编译命令:gcc -o main main.c $(curl-config --static-libs),链接器报错如下:
root@74c0362a3530:/# gcc -o main main.c $(curl-config --static-libs) /usr/bin/ld: cannot find -lnghttp2: No such file or directory /usr/bin/ld: cannot find -lidn2: No such file or directory /usr/bin/ld: cannot find -lrtmp: No such file or directory /usr/bin/ld: cannot find -lssh: No such file or directory /usr/bin/ld: cannot find -lssh: No such file or directory /usr/bin/ld: cannot find -lpsl: No such file or directory /usr/bin/ld: cannot find -lssl: No such file or directory /usr/bin/ld: cannot find -lcrypto: No such file or directory /usr/bin/ld: cannot find -lssl: No such file or directory /usr/bin/ld: cannot find -lcrypto: No such file or directory /usr/bin/ld: cannot find -lgssapi_krb5: No such file or directory /usr/bin/ld: cannot find -llber: No such file or directory /usr/bin/ld: cannot find -lldap: No such file or directory /usr/bin/ld: cannot find -llber: No such file or directory /usr/bin/ld: cannot find -lzstd: No such file or directory /usr/bin/ld: cannot find -lbrotlidec: No such file or directory /usr/bin/ld: cannot find -lz: No such file or directory
3. 验证系统中依赖库的存在性
通过ldd查看系统自带curl的动态依赖,确认所有报错的库均已存在且可正常解析:
root@74c0362a3530:/# ldd /usr/bin/curl linux-vdso.so.1 (0x0000ffffb1add000) libcurl.so.4 => /lib/aarch64-linux-gnu/libcurl.so.4 (0x0000ffffb1970000) libz.so.1 => /lib/aarch64-linux-gnu/libz.so.1 (0x0000ffffb1930000) libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffb1770000) /lib/ld-linux-aarch64.so.1 (0x0000ffffb1aa0000) libnghttp2.so.14 => /lib/aarch64-linux-gnu/libnghttp2.so.14 (0x0000ffffb1720000) libidn2.so.0 => /lib/aarch64-linux-gnu/libidn2.so.0 (0x0000ffffb16e0000) librtmp.so.1 => /lib/aarch64-linux-gnu/librtmp.so.1 (0x0000ffffb16a0000) libssh.so.4 => /lib/aarch64-linux-gnu/libssh.so.4 (0x0000ffffb1610000) libpsl.so.5 => /lib/aarch64-linux-gnu/libpsl.so.5 (0x0000ffffb15d0000) libssl.so.3 => /lib/aarch64-linux-gnu/libssl.so.3 (0x0000ffffb1500000) libcrypto.so.3 => /lib/aarch64-linux-gnu/libcrypto.so.3 (0x0000ffffb1080000) libgssapi_krb5.so.2 => /lib/aarch64-linux-gnu/libgssapi_krb5.so.2 (0x0000ffffb1010000) libldap.so.2 => /lib/aarch64-linux-gnu/libldap.so.2 (0x0000ffffb0f90000) liblber.so.2 => /lib/aarch64-linux-gnu/liblber.so.2 (0x0000ffffb0f60000) libzstd.so.1 => /lib/aarch64-linux-gnu/libzstd.so.1 (0x0000ffffb0ea0000) libbrotlidec.so.1 => /lib/aarch64-linux-gnu/libbrotlidec.so.1 (0x0000ffffb0e70000) libunistring.so.5 => /lib/aarch64-linux-gnu/libunistring.so.5 (0x0000ffffb0ca0000) libgnutls.so.30 => /lib/aarch64-linux-gnu/libgnutls.so.30 (0x0000ffffb0a80000) libhogweed.so.6 => /lib/aarch64-linux-gnu/libhogweed.so.6 (0x0000ffffb0a10000) libnettle.so.8 => /lib/aarch64-linux-gnu/libnettle.so.8 (0x0000ffffb09a0000) libgmp.so.10 => /lib/aarch64-linux-gnu/libgmp.so.10 (0x0000ffffb0900000) libkrb5.so.3 => /lib/aarch64-linux-gnu/libkrb5.so.3 (0x0000ffffb0820000) libk5crypto.so.3 => /lib/aarch64-linux-gnu/libk5crypto.so.3 (0x0000ffffb07d0000) libcom_err.so.2 => /lib/aarch64-linux-gnu/libcom_err.so.2 (0x0000ffffb07a0000) libkrb5support.so.0 => /lib/aarch64-linux-gnu/libkrb5support.so.0 (0x0000ffffb0770000) libsasl2.so.2 => /lib/aarch64-linux-gnu/libsasl2.so.2 (0x0000ffffb0730000) libbrotlicommon.so.1 => /lib/aarch64-linux-gnu/libbrotlicommon.so.1 (0x0000ffffb06f0000) libp11-kit.so.0 => /lib/aarch64-linux-gnu/libp11-kit.so.0 (0x0000ffffb0520000) libtasn1.so.6 => /lib/aarch64-linux-gnu/libtasn1.so.6 (0x0000ffffb04e0000) libkeyutils.so.1 => /lib/aarch64-linux-gnu/libkeyutils.so.1 (0x0000ffffb04b0000) libresolv.so.2 => /lib/aarch64-linux-gnu/libresolv.so.2 (0x0000ffffb0480000) libffi.so.8 => /lib/aarch64-linux-gnu/libffi.so.8 (0x0000ffffb0450000)
4. 动态链接可正常工作
使用动态链接参数编译可正常完成,生成的程序也能正确加载所有依赖:
root@74c0362a3530:/# curl-config --libs -lcurl root@74c0362a3530:/# cc -o main main.c $(curl-config --libs) root@74c0362a3530:/# ldd main linux-vdso.so.1 (0x0000ffffa070d000) libcurl.so.4 => /lib/aarch64-linux-gnu/libcurl.so.4 (0x0000ffffa05d0000) libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffa0410000) libnghttp2.so.14 => /lib/aarch64-linux-gnu/libnghttp2.so.14 (0x0000ffffa03c0000) libidn2.so.0 => /lib/aarch64-linux-gnu/libidn2.so.0 (0x0000ffffa0380000) librtmp.so.1 => /lib/aarch64-linux-gnu/librtmp.so.1 (0x0000ffffa0340000) libssh.so.4 => /lib/aarch64-linux-gnu/libssh.so.4 (0x0000ffffa02b0000) libpsl.so.5 => /lib/aarch64-linux-gnu/libpsl.so.5 (0x0000ffffa0270000) libssl.so.3 => /lib/aarch64-linux-gnu/libssl.so.3 (0x0000ffffa01a0000) libcrypto.so.3 => /lib/aarch64-linux-gnu/libcrypto.so.3 (0x0000ffff9fd20000) libgssapi_krb5.so.2 => /lib/aarch64-linux-gnu/libgssapi_krb5.so.2 (0x0000ffff9fcb0000) libldap.so.2 => /lib/aarch64-linux-gnu/libldap.so.2 (0x0000ffff9fc30000) liblber.so.2 => /lib/aarch64-linux-gnu/liblber.so.2 (0x0000ffff9fc00000) libzstd.so.1 => /lib/aarch64-linux-gnu/libzstd.so.1 (0x0000ffff9fb40000) libbrotlidec.so.1 => /lib/aarch64-linux-gnu/libbrotlidec.so.1 (0x0000ffff9fb10000) libz.so.1 => /lib/aarch64-linux-gnu/libz.so.1 (0x0000ffff9fad0000) /lib/ld-linux-aarch64.so.1 (0x0000ffffa06d0000) libunistring.so.5 => /lib/aarch64-linux-gnu/libunistring.so.5 (0x0000ffff9f900000) libgnutls.so.30 => /lib/aarch64-linux-gnu/libgnutls.so.30 (0x0000ffff9f6e0000) libhogweed.so.6 => /lib/aarch64-linux-gnu/libhogweed.so.6 (0x0000ffff9f670000) libnettle.so.8 => /lib/aarch64-linux-gnu/libnettle.so.8 (0x0000ffff9f600000) libgmp.so.10 => /lib/aarch64-linux-gnu/libgmp.so.10 (0x0000ffff9f560000) libkrb5.so.3 => /lib/aarch64-linux-gnu/libkrb5.so.3 (0x0000ffff9f480000) libk5crypto.so.3 => /lib/aarch64-linux-gnu/libk5crypto.so.3 (0x0000ffff9f430000) libcom_err.so.2 => /lib/aarch64-linux-gnu/libcom_err.so.2 (0x0000ffff9f400000) libkrb5support.so.0 => /lib/aarch64-linux-gnu/libkrb5support.so.0 (0x0000ffff9f3d0000) libsasl2.so.2 => /lib/aarch64-linux-gnu/libsasl2.so.2 (0x0000ffff9f390000) libbrotlicommon.so.1 => /lib/aarch64-linux-gnu/libbrotlicommon.so.1 (0x0000ffff9f350000) libp11-kit.so.0 => /lib/aarch64-linux-gnu/libp11-kit.so.0 (0x0000ffff9f180000) libtasn1.so.6 => /lib/aarch64-linux-gnu/libtasn1.so.6 (0x0000ffff9f140000) libkeyutils.so.1 => /lib/aarch64-linux-gnu/libkeyutils.so.1 (0x0000ffff9f110000) libresolv.so.2 => /lib/aarch64-linux-gnu/libresolv.so.2 (0x0000ffff9f0e0000) libffi.so.8 => /lib/aarch64-linux-gnu/libffi.so.8 (0x0000ffff9f0b0000) root@74c0362a3530:/#
5. 测试代码main.c
#include <curl/curl.h> int main(void) { CURL *curl = curl_easy_init(); if(curl) { curl_easy_cleanup(curl); } return 0; }
内容的提问来源于stack exchange,提问作者Philippe
相关产品推荐
相关产品推荐

