这里的现状我在:链接应用程序libbz2.so.1而非libbz2.so.1.0
我想发布在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
?
谢谢。
* facepalm * ...因为这太明显了。出于某种原因,我认为bzip2会被授权LGPL,它禁止静态链接,但它似乎是BSD,它允许它......静态链接它。谢谢。 – Fred 2009-12-02 20:37:20
没有汗水。但为什么你认为LGPL有什么可以说你如何链接?您可以使用LGPL和GPL代码的静态或动态链接 - 您的限制是如何分发您的应用程序等pp,以及是否需要提供源代码。这完全独立于您的构建过程。 – 2009-12-02 20:45:08
好吧,我应该更精确。 LGPL禁止静态链接到专有应用程序。 作为人们寻找完整的答案,这里是如何做到这一点,如果你想带*号部分*库和动态带*号部分*其他库静态链接: G ++ -Wl,-Bstatic -lbz2轮候册, - Bdynamic -lotherlib -o main.cpp中TEST.bin,烧写它 – Fred 2009-12-02 21:08:48