首页 文章

如何在gcc中将静态库链接到动态库中

提问于
浏览
30

在gcc(g)下,我编译了一个静态 .a (称之为 some_static_lib.a )库 . 我想将这个 .a 文件链接(是正确的短语?)到我正在构建的另一个动态库(称为 libsomeDyn.so ) . 虽然 .so 编译,但我没有在 .so 下使用 nm 命令看到 .a 的内容:

/ usr / bin / g -fPIC -g -O2 -Wall -Werror -pipe -march = pentium3 -mtune = prescott -MD -D_FILE_OFFSET_BITS = 64 -DLINUX -D_GNU_SOURCE -D_THREAD_SAFE -I ../../../ ../../../../../ -I ../../../../../../../..// libraries -Wl,-rpath,/ usr / lib -o libsomeDyn.so some.o another.o some_static_lib.a -shared -Wl -x -Wl,-soname,libsomeDyn.so

我在 libsomeDyn.so 下没有看到 some_static_lib.a 下的功能 . 我究竟做错了什么?

2 回答

  • 35

    静态库在链接时有特殊规则 . 如果对象提供未解析的符号,则只会将静态库中的对象添加到二进制文件中 .

    在Linux上,您可以使用 --whole-archive 链接器选项更改该行为:

    g++ -Wl,--whole-archive some_static_lib.a -Wl,--no-whole-archive
    
  • 15

    对于像我这样遇到问题的每一个人(并且没有正确理解答案):这里有一个简短的如何从静态库(mylib.a)生成动态库(libmylib.so):

    1.)创建一个仅导入mylib.h文件的mylib.c文件

    2.)将此mylib.c编译为mylib.o

    gcc -c -fPIC mylib.c -o msat.o
    

    3.)使用以下命令生成动态库:

    gcc --whole-archive -shared -Wl,-soname,libmylib.so -o libmylib.so mylib.o mylib.a
    

    这至少对我有用,将静态库(使用-fPIC编译)转换为动态库 . 我不确定这对其他图书馆是否有效 .

相关问题