gcc中共享库函数的静态链接
如何在gcc中静态链接共享库函数?
参考:
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链接。
您必须将liborangejuice
与liborangejuice
静态链接以获得静态的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中的二进制文件
最好的祝福
下面是在gcc
build立静态链接共享库的一个概念validation: https : //github.com/calebmadrigal/static-shared-lib
在gcc中,这不被支持。 事实上,这在我知道的任何现有的编译器/链接器中都不被支持。