首先我要声明我不是编译专家。我正在尝试编译一些使用 libcurl(以及其他库)的 c 代码,并且我希望它尽可能跨 Linux 平台。我使用的是 Ubuntu 22.04.1 x86_x64 桌面版。我也尝试过使用 alpine docker,但结果同样失败。我将分享我在 Ubuntu 上尝试过的步骤:
首先,我更新了我的计算机:sudo apt-get update
。然后我下载了 musl。我使用了sudo apt-get install musl-tools && sudo apt-get install musl-dev
。克隆还需要其他依赖项(例如 git),但我尝试主要使用这些命令来执行 musl 的操作。
然后我 git cloned openssl (版本 3.3.0)。虽然这需要一些时间,但我认为我确实设法静态编译了 openssl:。file /musl/bin/openssl leads to output of /musl/bin/openssl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, with debug_info, not stripped; ldd /musl/bin/openssl leads to output of: not a dynamic executable
接下来我尝试对 libcurl 执行相同的过程,git cloning curl-8.6.0 fromhttps://github.com/curl/curl(我坚持使用 master 分支)。然后我执行了以下步骤:
./configure --prefix=/musl --with-ssl=/musl --without-libpsl --enable-static --disable-shared --disable-dependency-tracking LDFLAGS="-L/musl/lib64 -static -static-libgcc" CPPFLAGS="-I/musl/include" LIBS="-ldl -lpthread -lcrypto"
(我尝试包含 -lssl 但这会导致更多错误所以我尝试将其排除在外)。make && make install
(在常规 ubuntu 上我使用 sudo,但在 docker 构建上却不是这样,因为我正在写入 /musl 并且不想更改路径所有者)。
构建似乎已完成,但是当我检查 /musl/bin/curl 是否与文件命令静态链接时,我得到了以下结果:
/musl/bin/curl: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, with debug_info, not stripped
并使用 ldd:
/musl/bin/curl: error while loading shared libraries: /lib/x86_64-linux-gnu/libc.so: invalid ELF header
有没有人设法使用 musl/musl-gcc 成功获得静态编译的 libcurl 版本?或者,如果人们有其他他们推荐用于 ubuntu 构建的喜欢的静态编译器,我会尽可能地使用,我的最终二进制编译通常包括 -lcrypto 和 -lcurl。提前感谢您的帮助,我会尽量及时回答任何问题。