如何用静态库编译?

时间:2015-09-05 09:31:44

标签: linux g++

我的应用程序编译并正常运行:

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

如果我将共享更改为静态,则会收到错误:

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:In   函数_start': /build/glibc-Ir_s5K/glibc-2.19/csu/../sysdeps/x86_64/start.S:118: undefined reference to main'   /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libphpcpp.a(value.o):   在函数Php::Value::Value()': /root/MyTest/full/zend/value.cpp:40: undefined reference to _ emalloc'中   /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libphpcpp.a(value.o):   在函数Php::Value::Value(decltype(nullptr))': /root/MyTest/full/zend/value.cpp:50: undefined reference to _ emalloc'中   /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libphpcpp.a(value.o):   在函数Php::Value::Value(short)': /root/MyTest/full/zend/value.cpp:61: undefined reference to _ emalloc'中   /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libphpcpp.a(value.o):   在函数Php::Value::Value(int)': /root/MyTest/full/zend/value.cpp:72: undefined reference to _ emalloc'中   /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libphpcpp.a(value.o):   在函数Php::Value::Value(long)': /root/MyTest/full/zend/value.cpp:83: undefined reference to _ emalloc'中   /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libphpcpp.a(value.o):/root/MyTest/full/zend/value.cpp :94:   更多未定义的引用`_emalloc'跟随........

如何编译到静态库?

1 个答案:

答案 0 :(得分:3)

有几个问题。

open source lib不是static的反转。

  

-static
  在支持动态链接的系统上,这会阻止与共享库的链接。在其他系统上,此选项无效。

     

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

如您所见,shared确定生成哪种输出文件,而-shared确定使用哪种输入文件。

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

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

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

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

    编译器和链接器都不会生成静态库。

    有一个名为emalloc的单独工具。由于静态库是愚蠢的(见上文),您不应该也不能通过ar任何其他库来链接。 ar没有链接,它会创建一个稍后要链接的哑存档。将程序与静态库链接时,您不仅需要指定库,还需要指定ar-lphpcpp以及您直接或间接引用的任何其他静态库。