符号查找错误(链接共享库时可执行问题)

问题描述 投票:0回答:1

场景(Linux):

   Executable -> shared library -> [xrt static library]
                                   (It is a commercial product based on Motif)

可执行文件会调用共享库,共享库会调用静态库

我执行以下操作来编译和链接共享库:

$ gcc -fPIC --unresolved-symbols=ignore-in-shared-lib -c demo.c      (compling)
$ gcc -shared -o libdemo.so demo.o                                   (linking)

这里注意,我没有链接xrt静态库,虽然它使用了xrt静态库函数

可执行文件将链接共享库(libdemo.so),如下所示:

$ gcc -fPIC --unresolved-symbols=ignore-in-shared-lib main.c -Ixxxx
$ gcc -o main main.o -Lxxxx -ldemo -L/opt/xrt/lib -lxrtm -lXpm -lxrt3d -lxrtfield -lxrtgauge -lxrtm -lxrttable -lpdsutil

这里的可执行文件链接了xrt静态库

当我运行可执行文件时,它给我“符号查找错误”:

$ ./main
./main: symbol lookup error: /xxx/libdemo.so: undefined symbol: xmXrtTabManagerWidgetClass

在xrt静态库目录下,有一些静态库。当我运行

nm
命令时,它给了我以下结果:

$ nm *.a | grep xmXrtTabManagerWidgetClass
                  U xmXrtTabManagerWidgetClass
0000000000000b18  D xmXrtTabManagerWidgetClass
                  U xmXrtTabManagerWidgetClass
                  U xmXrtTabManagerWidgetClass

xmXrtTabManagerWidgetClass
符号在商业产品中定义(包装在静态库中)。有什么办法可以解决这个问题吗?

c shared-libraries undefined-symbol
1个回答
0
投票

静态库是静态的,不是动态的,你不能“调用”静态库,你必须编译(链接)它所以它是“内部”的东西。您可以编译静态库以共享以“调用”(动态链接)它,或者您可以将静态库包含在可执行文件里面。

在主要可执行文件中编译它。

gcc xrt.a main.o -o main ...
© www.soinside.com 2019 - 2024. All rights reserved.