提问者:小点点

如何使用静态库进行编译?


我的应用程序编译并运行良好:

g++-shared-o myexten.so exm2.o main.o exm1.o-lphpcpp

如果将shared更改为static,则会出现一个错误:

g++-static-o myexten.so exm2.o main.o exm1.o-lphpcpp

/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o:在函数_start':/build/glibc-ir_s5k/glibc-2.19/csu/../sysdeps/x86_64/start.s:118:对main的未定义引用'/usr/lib/gcc/x86_64-linux-gnu/4.9/../../lib/libphpcpp.a(Value.o):在函数nu/4.9/../../../../lib/libphpcpp.a(value.o):在函数php::value::value(long)中:/root/mytest/full/zend/value.cp:83:对_emalloc'的未定义引用/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libphpcpp.a(value.o):/root/mytest/full/zend/value.cp:94:对'_emalloc'的更多未定义引用

如何编译到静态库?


共1个答案

匿名用户

有几个问题。

-static
在支持动态链接的系统上,这将阻止与共享库进行链接。在其他系统上,此选项不起作用。

-shared
生成一个共享对象,然后该对象可以与其他对象链接以形成一个可执行文件。

正如您所看到的,-shared决定产生什么样的输出文件,而-statice决定使用什么样的输入文件。

如果要创建不链接到其他共享库的共享库,则需要:

  1. 同时指定-shared-static。如果不指定shared,链接器将尝试创建可执行文件。
  2. 在命令行中枚举所有需要的库,而不仅仅是那些您直接引用的库。例如,如果链接到libA,而libA从libB调用函数,则必须(与共享库的情况不同)在链接行中提到libB。这是因为:

它们是对象文件的简单归档。它们不包含其他库或引用。虽然libphpcpp.so知道它正在使用libphp.so,但libphpcpp.a却不知道。它只是有一个对emalloc的未解析引用。您的工作是提供一个库,该库提供emalloc以满足引用。

另外,如果要构建静态库,应该知道:

有一个名为ar的单独工具用于此操作。而且由于静态库是哑的(见上文),您不应该也不能传递ar任何其他库来链接。ar不链接,它创建一个哑存档,以便以后链接。在将程序与静态库链接时,不仅必须指定库,还必须指定-lphpcpp-lphp以及直接或间接引用的任何其他静态库。