这是我目前的情况:

我想在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.1libbz2.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上进行了部署,使用静态构建就可以很好地工作。

09-17 11:41