场景(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
符号在商业产品中定义(包装在静态库中)。有什么办法可以解决这个问题吗?
静态库是静态的,不是动态的,你不能“调用”静态库,你必须编译(链接)它所以它是“内部”的东西。您可以编译静态库以共享以“调用”(动态链接)它,或者您可以将静态库包含在可执行文件里面。
在主要可执行文件中编译它。
gcc xrt.a main.o -o main ...