首页 文章

如何用静态库编译?

提问于
浏览
0

我的应用程序编译并正常工作:

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 回答

  • 3

    有几个问题 .

    static不是共享的反转 .

    -static在支持动态链接的系统上,这可以防止与共享库链接 . 在其他系统上,此选项无效 . -shared生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件 .

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

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

    • 指定 -shared-static . 如果未指定 shared ,则链接器将尝试创建可执行文件 .

    • 在命令行上枚举所有需要的库,而不仅仅是您直接引用的库 . 例如,如果链接到libA和libA从libB调用函数,则 must (与共享库的情况不同)在链接行上提及libB . 这是因为:

    静态库很笨 .

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

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

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

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

相关问题