构建包含静态对象的二进制文件

构建包含静态对象的二进制文件

是否可以构建包含相关 .so 文件的二进制文件,以便可以构建一次二进制文件并在具有相同硬件和操作系统的计算机上使用,而无需它们具有 .so 文件?

例如,我正在使用 nghttp2 构建curl。我愿意

 ./configure --with-nghttp2=/usr/local

然后我跑了。我得到了curl二进制文件。当我将此二进制文件复制到另一台机器上并尝试运行它时,它说

./curl: error while loading shared libraries: libnghttp2.so.14: cannot open shared object file: No such file or directory

我还尝试运行 make 如下:

make SHARED=0 CFLAGS='-static'

我仍然遇到同样的错误。

答案1

依赖的 .so 文件可以采用共享对象(它们是 .so 文件)或 .a 文件(也称为静态对象)的形式。您可以重建 nghttp2 并将--disable-shared标志传递给它的配置。然后你可以像往常一样尝试重新配置和重建curl。

关键是要确保 /usr/local/lib 中只有静态 .a 对象可以链接curl。

不要忘记检查 /usr/local/lib 不包含 nghttp2 的 .so 版本! (或者您可以指定另一个 --prefix= 进行试验。您甚至可以将任何内容安装到 /tmp 或 $HOME 中并使用本地创建的树)

请注意,这将不会消除curl的其他依赖关系,因为它是依赖于第三方代码的大型项目。它甚至可以依赖于它自己,libcurl。您可以将--disable-shared标志传递给它以仅构建它的静态版本。最后,运行readelf -d /path/to/your/curl | fgrep NEEDED查看它的完整依赖项!

相关内容