这是我目前的情况:
我想在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
?谢谢。
最佳答案
您为什么不只是静态链接呢?
过去,我已经在Ubuntu上进行了构建,并在RHEL上进行了部署,使用静态构建就可以很好地工作。