gcc中共享库函数的静态链接

如何在gcc中静态链接共享库函数?

参考:

http://www.linuxquestions.org/questions/linux-newbie-8/forcing-static-linking-of-shared-libraries-696714/

http://linux.derkeiler.com/Newsgroups/comp.os.linux.development.apps/2004-05/0436.html

您需要静态版本的库链接。

共享库实际上是一个特殊格式的可执行文件,指定了入口点(包括一些粘性寻址问题)。 它没有静态链接所需的所有信息。

您不能静态链接共享库(或dynamic链接静态)

标志 – 将强制链接器使用静态库(.a),而不是共享(.so)但是。 静态库并不总是默认安装。 所以如果你需要静态链接,你必须安装静态库。

另一个可能的方法是使用statifier或貂 。 这两个工具都将dynamic链接的可执行文件作为input,并将输出创build为包含所有共享库的独立可执行文件

如果你想链接,如libapplejuice静态,但不是说, liborangejuice ,你可以这样链接:

 gcc object1.o object2.o -Wl,-Bstatic -lapplejuice -Wl,-Bdynamic -lorangejuice -o binary 

有一个警告 – 如果liborangejuice使用libapplejuice ,那么libapplejuice也会dynamic链接。

您必须将liborangejuiceliborangejuice静态链接以获得静态的libapplejuice

不要忘记保持-Wl,-Bdynamic否则你最终会链接一切静态,包括libc (这不是一件好事)。

如果你有共享库(.so)的.a文件,你可以简单地把它包含在它的完整path中,就像它是一个目标文件一样,如下所示:

这通过编译生成main.o:

 gcc -c main.c 

这将该对象文件与相应的静态库链接起来,并创build可执行文件(名为“main”):

 gcc main.o mylibrary.a -o main 

或者在一个单一的命令:

 gcc main.c mylibrary.a -o main 

它也可能是一个绝对或相对的path:

 gcc main.c /usr/local/mylibs/mylibrary.a -o main 

有点晚,但是…我find了几年前我保存的链接,我认为这可能对你们有用:

CDE:自动创build可移植的Linux应用程序

http://www.pgbovine.net/cde.html

  • 只需下载该程序
  • 执行二进制传递作为参数你想要的二进制的名称可移植,例如: nmap

    ./cde_2011-08-15_64bit nmap

该程序将读取链接到nmap及其相关库的所有库,并将其保存在一个名为cde-package / (与您在同一目录中)的文件夹中。

  • 最后,您可以压缩文件夹并在任何系统中部署便携式二进制文件。

请记住,要启动可移植程序,您必须执行位于cde-package / nmap.cde中的二进制文件

最好的祝福

下面是在gccbuild立静态链接共享库的一个概念validation: https : //github.com/calebmadrigal/static-shared-lib

在gcc中,这不被支持。 事实上,这在我知道的任何现有的编译器/链接器中都不被支持。