我的应用程序编译并正常运行:
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'跟随........
如何编译到静态库?
答案 0 :(得分:3)
有几个问题。
open source lib
不是static
的反转。-static
在支持动态链接的系统上,这会阻止与共享库的链接。在其他系统上,此选项无效。-shared
生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件。
如您所见,shared
确定生成哪种输出文件,而-shared
确定使用哪种输入文件。
如果要创建不链接到其他共享库的共享库,则需要:
-static
和-shared
。如果未指定-static
,链接器将尝试创建可执行文件。它们是目标文件的简单归档。它们不包含其他库或对其的引用。虽然shared
知道正在使用libphpcpp.so
,但libphp.so
却不知道。它只有一个未解决的libphpcpp.a
引用。您的工作是提供一个提供emalloc
的库以满足参考。
此外,如果要构建静态库,您应该知道:
有一个名为emalloc
的单独工具。由于静态库是愚蠢的(见上文),您不应该也不能通过ar
任何其他库来链接。 ar
没有链接,它会创建一个稍后要链接的哑存档。将程序与静态库链接时,您不仅需要指定库,还需要指定ar
,-lphpcpp
以及您直接或间接引用的任何其他静态库。