gpt4 book ai didi

c - 我如何始终包含静态库中的符号?

转载 作者:IT王子 更新时间:2023-10-29 01:07:13 25 4
gpt4 key购买 nike

假设我有一个静态库 libx.a。如何使该库中的某些符号(不是全部)始终出现在我与我的库链接的任何二进制文件中?原因是我需要这些符号通过 dlopen+dlsym 可用。我知道 --whole-archive 链接器开关,但它强制所有目标文件从库存档链接到生成的二进制文件,这不是我想要的...

到目前为止的观察(CentOS 5.4,32 位)(upd:这一段是错误的;我无法重现此行为)

ld main.o libx.a

将愉快地去除所有未引用的符号,而

ld main.o -L. -lx

将链接整个库。我想这取决于所使用的 binutils 版本,但是,较新的链接器将能够从静态库中挑选单个对象。

另外一个问题是在Windows下如何实现同样的效果呢?

提前致谢。任何提示将不胜感激。

最佳答案

假设您有一个项目,在同一文件夹中包含以下三个 C 文件;

// ---- jam.h
int jam_badger(int);

// ---- jam.c
#include "jam.h"
int jam_badger(int a)
{
return a + 1;
}

// ---- main.c
#include "jam.h"
int main()
{
return jam_badger(2);
}

然后您使用这样的 boost-build bjam 文件构建它;

lib jam : jam.c <link>static ;

lib jam_badger : jam ;

exe demo : jam_badger main.c ;

你会得到这样的错误。

undefined reference to `jam_badger'

(我在这里使用了 bjam,因为该文件更易于阅读,但您可以使用任何您想要的)

删除“static”会产生一个有效的二进制文件,就像将 static 添加到另一个库一样,或者只使用一个库(而不是在另一个库中进行愚蠢的包装)

发生这种情况的原因是因为 ld 足够聪明,可以只选择实际使用的文件部分,在这种情况下,它们都不是。

解决方案是用 -Wl,--whole-archive 和 -Wl,--no-whole-archive 包围静态存档,就像这样;

g++ -o "libjam_candle_badger.so" -Wl,--whole-archive libjam_badger.a Wl,--no-whole-archive

不太确定如何让 boost-build 为您执行此操作,但您明白了。

关于c - 我如何始终包含静态库中的符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1763038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com