我的应用程序编译并正常工作:
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:在函数_start'中:/ build / glibc-Ir_s5K / glibc-2.19 /csu/../sysdeps/x86_64/start.S:118:undefined reference tomain'/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:未定义引用to_emalloc'/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libphpcpp.a(value.o):在函数Php :: V中alue :: 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 回答
有几个问题 .
static不是共享的反转 .
如您所见,
-shared
确定生成哪种输出文件,而-static
确定使用哪种输入文件 .如果要创建不链接到其他共享库的共享库,则需要:
指定
-shared
和-static
. 如果未指定shared
,则链接器将尝试创建可执行文件 .在命令行上枚举所有需要的库,而不仅仅是您直接引用的库 . 例如,如果链接到libA和libA从libB调用函数,则 must (与共享库的情况不同)在链接行上提及libB . 这是因为:
静态库很笨 .
它们是目标文件的简单归档 . 它们不包含其他库或对其的引用 . 虽然
libphpcpp.so
知道它正在使用libphp.so
,但libphpcpp.a
却不知道 . 它只是一个未解决的emalloc
引用 . 您的工作是提供一个提供emalloc
的库,以满足参考 .另外,如果要构建静态库,您应该知道:
编译器和链接器都不生成静态库 .
有一个名为
ar
的独立工具 . 由于静态库是愚蠢的(见上文),你不应该也不能通过ar
任何其他库来链接 .ar
没有链接,它会创建一个稍后要链接的哑存档 . 将程序与静态库链接时,不仅要指定库,还要指定-lphpcpp
,-lphp
以及直接或间接引用的任何其他静态库 .