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

发布于 2024-08-20 07:13:41 字数 775 浏览 13 评论 0原文

这个问题的标题是完全是骗局,但是该问题的答案对我没有帮助。

我有一堆目标文件打包在静态库中:

% 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 ,一切都很好。

the title of this question is an exact dupe, but the answers in that question don't help me.

I have a bunch of object files packed in a static library:

% 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

I'd like to generate libsome.so from libsome.a instead of the object files, but the library is really barebones:

% 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

the static library is ok, or at least I'm perfectly able to link it to an executable and have it run the contained functionality. also, everything is fine if I create libsome.so from foo.o and bar.o.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

野の 2024-08-27 07:13:41

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

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

如果您正在做一些更复杂的事情,您想要所有库 some 但只需要 libsome 所需的库支持的一部分,您会在 libsome 上使用后想要关闭整个存档:

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

如果您不使用 GNU 链接器,您需要查看您的链接器是否支持它以及它的名称。在 Sun 链接器上,它称为 -z allextract-z defaultextract

Assuming you're using the GNU linker, you need to specify the --whole-archive option so that you'll get all the contents of the static archive. Since that's an linker option, you'll need -Wl to tell gcc to pass it through to the linker:

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

If you were doing something more complicated where you want all of library some but only the part of library support needed by libsome, you would want to turn off whole archive after you've used it on libsome:

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

If you're not using the GNU linker, you'll need to see if your linker supports it and what it's called. On the Sun linker, it's called -z allextract and -z defaultextract.

臻嫒无言 2024-08-27 07:13:41

您的文件不会从 .a 文件中提取,因为没有任何内容引用它们。为什么要先创建 .a 文件?通过使用 -r 选项链接它们,您可以更好地制作 .o 文件。

Your files are not being pulled in from the .a file because nothing is referencing them. Why are you making a .a file first? You'd have better luck making a .o file by linking them with the -r option.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文