代码之家  ›  专栏  ›  技术社区  ›  just somebody

将静态库转换为共享库(从libsome.a创建libsome.so):我的符号在哪里?

  •  11
  • just somebody  · 技术社区  · 15 年前

    这个问题的标题是 exact dupe 但那个问题的答案对我没有帮助。

    我在静态库中打包了一堆对象文件:

    % g++ -std=c++98 -fpic -g -O1 -c -o foo.o foo.cpp
    % g++ -std=c++98 -fpic -g -O1 -c -o bar.o bar.cpp
    % ar -rc libsome.a foo.o bar.o
    

    我想从libsome.a而不是对象文件生成libsome.so,但是库是 真正地 赤裸:

    % g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so libsome.a
    % nm -DC libsome.so
    0000xxxx A _DYNAMIC
    0000xxxx A _GLOBAL_OFFSET_TABLE_
             w _Jv_RegisterClasses
    0000xxxx A __bss_start
             w __cxa_finalize
    0000xxxx A _edata
    0000xxxx A _end
    0000xxxx T _fini
    0000xxxx T _init
    

    静态库是可以的,或者至少我完全能够将它链接到可执行文件并让它运行包含的功能。另外,如果我从foo.o和bar.o中创建libsome.so,一切都很好。

    2 回复  |  直到 15 年前
        1
  •  23
  •   R Samuel Klatchko    15 年前

    假设您使用的是GNU链接器,那么您需要指定--whole-archive选项,以便获得静态归档的所有内容。因为这是一个链接器选项,所以您需要-wl告诉gcc将其传递给链接器:

    g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so -Wl,--whole-archive libsome.a
    

    如果您正在做一些更复杂的事情,希望所有的库都有一些,但只是libsome所需的部分库支持,那么在libsome上使用完之后,您将希望关闭整个存档:

    ... -Wl,--whole-archive libsome.a -Wl,--no-whole-archive libsupport.a
    

    如果你不使用GNU链接器,你需要看看你的链接器是否支持它,以及它叫什么。在Sun Linker上,它被称为 -z allextract -z defaultextract .

        2
  •  1
  •   Richard Pennington    15 年前

    没有从.a文件中拉入您的文件,因为没有任何文件引用它们。你为什么要先做一个.a文件?通过将.o文件与-r选项链接,您最好能创建一个.o文件。