【发布时间】:2009-12-02 20:14:05
【问题描述】:
这是我目前的情况:
我想在 Linux 上分发一个可以在多个发行版上运行的二进制应用程序(不是所有发行版,目前只是主要的问题,为了便于讨论,让我们关注 Ubuntu 和 Fedora)。有问题的应用程序链接到libbz2 以进行某些工作。一个简单的“Hello World”将说明情况:
/* main.cpp */
#include <iostream>
int main(int argc, char* argv[])
{
std::cout << "Hello World!\n";
return 0;
}
应用程序是这样构建的:
g++ -lbz2 -o test.bin main.cpp
我的构建系统在 Ubuntu 上。当我对生成的二进制文件执行 ldd 检查时,它会将 libbz2.so.1.0 列为运行时依赖项。当我将此应用程序带到 Fedora 机器上时,该应用程序无法运行,并且 ldd 显示它找不到 libbz2.so.1.0。 Fedora 只有libbz2.so.1 和libbz2.so.1.0.4,但没有libbz2.so.1.0。
Red Hat's Bugzilla database 表明这种行为不是错误,而是一个特性。我真的不需要libbz2.so.1.0,只要链接到libbz2.so.1 我就会很满意,但我还没有弄清楚如何。
我见过similar question asked here previously,但接受的答案(您可以在链接器命令行上传递实际的 .so 文件而不是 -l)似乎不起作用。我尝试使用以下命令进行构建:
g++ /lib/libbz2.so.1 -o test.bin main.cpp
但是,ldd 仍然提到该应用程序依赖于libbz2.so.1.0,尽管我将全名传递给了 g++。
现在的问题是,在 Ubuntu 上是否有办法构建应用程序以使其仅依赖于 libbz2.so.1 而不是 libbz2.so.1.0?
谢谢。
【问题讨论】: