2016-12-02 74 views
3

我一直在努力与dlopen未定义的符号C:处理共享对象中的未定义符号

我已经和到目前为止已经试过:与功能functionA()

libraryB.so这是使用functionA()

libraryA.a与功能functionA()

libraryA.so

执行能够加载libraryB.so与dlopen。

我得到的是:

undefined symbol: functionA 

如何我构建:

LibraryA的:

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 

libraryB:

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标志,但也没有成功。

任何人都可以帮我吗?

回答

1

您需要链接libraryB.solibraryA.so因为libraryB.so使用libraryA.so的符号。

只需添加libraryA.solibraryB.so的链接命令。

具体情况取决于库安装您可能还需要使用-rpath标志。

此外,由于libraryB.so依赖于libraryA.so,因此您的Makefile规则应明确指定此依赖关系。

+0

这也是我用** - L **和** - l **选项尝试过的,但是我仍然有** libraryB中的未定义符号** – Elec

+0

不,只是明确列出'libraryB.so'链接命令。 –

+0

尚未解决。 '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.so libraryB.c -shared -o libraryB.so' – Elec

-1

解决方案

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 libraryA_static.a -shared -o libraryB.so 

我建立我libraryB与A的静态库,之后一切都很好,我可以使用所有的符号和功能。

非常感谢大家!

+0

尽管如此,您现在已经将B *静态链接到了答:您应该能够将B *动态链接到A,以便它们可以独立更新。像'gcc -shared -o libraryB.so libraryB.c -lraryA'。如果你想确保满足B的所有要求,可以加上'-Wl, - no-undefined'。 –

0

当你建立图书馆B,你需要将其对图书馆的链接:

gcc -shared -o libraryB.so libraryB.c -lraryA 

您可能需要添加合适的-L选项,如果libraryA.so是不是已经在你的搜索路径。

如果图书馆B的目的是为完整,没有未定义的符号,将选项-Wl,--no-undefined添加到您的链接线。这样,任何缺失的依赖关系都会在链接时报告,而不是等到运行时。

否则,您仍然可以使用ldd检查libarryB.so以查看它引用的库。