gpt4 book ai didi

C:处理共享对象中的 undefined symbol

转载 作者:行者123 更新时间:2023-12-01 02:47:01 25 4
gpt4 key购买 nike

我一直在与 dlopenundefined symbols 作斗争。

到目前为止我所拥有的和尝试过的:

libraryA.a 带有函数 functionA()

libraryA.so 带有函数 functionA()

libraryB.so 正在使用 functionA()

使用 dlopen 加载 libraryB.so 的可执行文件。

我得到的是:

undefined symbol: functionA

我是如何构建的:

图书馆A:

gcc -std=gnu11 -O2 -g -Wall -Wstack-usage=2000 -Werror
-fdiagnostics-color -fPIC -pipe -fsigned-char -fno-asynchronous-unwind-tables
-fno-stack-protector -I../include/ libraryA.c -shared -o libraryA.so

图书馆B:

gcc -std=gnu11 -O2 -g -Wall -Wstack-usage=2000 -Werror -fdiagnostics-color 
-fPIC -pipe -fsigned-char -fno-asynchronous-unwind-tables
-fno-stack-protector -I../include/ libraryB.c -shared -o libraryB.so

构建可执行文件:

-std=gnu99 -pipe -fno-strict-aliasing -fsigned-char -fno-asynchronous-unwind-tables
-fno-stack-protector -Wall -Wextra -Wundef -Wno-sign-compare -Wno-unused-parameter
-Wno-packed-bitfield-compat -Wno-misleading-indentation -fomit-frame-pointer
-maccumulate-outgoing-args -fPIC -m64 -g3 -gdwarf-2 -fno-common -Wstrict-prototypes
-Wimplicit -Wno-pointer-sign -c executable.c -o executable libraryA.a

在此处像这样在可执行文件中打开 libraryB:

void *handle = dlopen("libraryB.so", RTLD_LAZY);

if (handle == NULL) {
fprintf( stderr, "Load error (%s)!\n", dlerror());
return NULL;
}

我该如何解决这个问题?我也尝试了标志 -rdynamic 但没有成功。我也尝试了不同的 dlopen 标志,但也没有成功。

谁能帮帮我?

最佳答案

您需要将 libraryB.solibraryA.so 链接起来,因为 libraryB.so 使用了来自 libraryA.so< 的符号.

只需将 libraryA.so 添加到 libraryB.so 的链接命令即可。

根据库的安装位置,您可能还需要使用 -rpath 标志。

此外,由于 libraryB.so 依赖于 libraryA.so,您的 Makefile 规则应该明确指定这种依赖性。

关于C:处理共享对象中的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40933207/

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