【问题标题】:how to link static library into dynamic library in gcc如何将静态库链接到 gcc 中的动态库
【发布时间】:2011-02-08 15:14:16
【问题描述】:

在 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../../ ../../../../../..//库 -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 下的函数。我做错了什么?

【问题讨论】:

    标签: gcc


    【解决方案1】:

    静态库在链接方面有特殊的规则。仅当对象提供未解析的符号时,静态库中的对象才会添加到二进制文件中。

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

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

    【讨论】:

    • 所以我在静态库中有一些奇怪的依赖。它引用动态库中包含的函数。如何告诉 gcc 在动态库中找到未定义的引用?谢谢
    • @bob - 静态库引用动态库中的符号应该没有问题(一旦链接静态库,就与直接引用命令上的 .o 一样线)。我怀疑肯定有其他问题,建议发布一个新问题。
    • 这对我来说是解决方案,但在 OSX 上,我必须使用 -all_load 等同于 --whole-archive,正如有人在 IRC 上建议我的那样。我希望它可以帮助别人!
    【解决方案2】:

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

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

    2.) 编译这个 mylib.c 到 mylib.o

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

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

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

    这至少对我有用,将静态库(使用 -fPIC 编译)转换为 一个动态库。我不确定这是否也适用于其他库。

    【讨论】:

    • 第 2 步应该说“mylib.o”而不是“msat.o”吗?
    • 我没有测试过,但基本思路应该还可以。从技术上讲,--whole-archive 是一个链接器选项(如果您将其传递为“gcc --whole-archive”,gcc 将无法理解它)。相反,它应该移过“-Wl”,例如:gcc -shared -Wl,--whole-archive,-soname,libmylib.so ...我会编辑答案,但我无法测试它是否作品。在当前形式下,会导致gcc错误(“无法识别的命令行选项‘--whole-archive’”)。
    • 另外 -Wl,--whole-archive ... -Wl,--no-whole-archive 块应该在静态库 (mylib.a) 周围。就像在接受的答案中一样。
    • 我注意到您忘记编写生成mylib.a 的步骤。为什么不对静态库使用不同的名称,例如mystaticlib.a
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多