Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将两个共享库链接在一起-对符号的未定义引用_C_Gcc_Linker_Ld_Symbols - Fatal编程技术网

C 将两个共享库链接在一起-对符号的未定义引用

C 将两个共享库链接在一起-对符号的未定义引用,c,gcc,linker,ld,symbols,C,Gcc,Linker,Ld,Symbols,我有两个共享库libA和libB,我想创建一个新的库libC,它链接到这两个库,这样我就可以将我的应用程序链接到-lC而不是-lA和-lB。 我不能使用-lA和-lB一个,因为否则我必须修复许多包 libB是一个预编译的二进制文件 我试着运行这个: gcc -fPIC -shared -o libA.so A.c gcc -shared -Wl,--no-as-needed -L. -lA -lB -o libC.so 但是当我链接我的应用程序时,需要libB和-lci App.o: unde

我有两个共享库libA和libB,我想创建一个新的库libC,它链接到这两个库,这样我就可以将我的应用程序链接到-lC而不是-lA和-lB。 我不能使用-lA和-lB一个,因为否则我必须修复许多包

libB是一个预编译的二进制文件

我试着运行这个:

gcc -fPIC -shared -o libA.so A.c
gcc -shared -Wl,--no-as-needed -L. -lA -lB -o libC.so
但是当我链接我的应用程序时,需要libB和-lci

App.o: undefined reference to symbol 'SymbolInB'
注意:“symbolnb”是在DSO libB中定义的。因此
请尝试将其添加到链接器命令行

libB.so: could not read symbols: Invalid operation

如果我运行
readelf-a libB.so
我在.dynsym中看到符号nb,它在libC.so中丢失。因此,我假设我错过了一个正确解析符号的链接选项?

它不是这样工作的。
libC
中的函数可以使用
libA
libB
中的函数,因为
libC
与其他库链接。但是,来自
libA
libB
的符号不是从
libC
导出的,因此如果您有一个直接使用
libB
函数的应用程序,那么您需要链接到
libB
,谢谢您的回复。因此,我正在考虑为
libB
中的每个函数编写包装函数(在
libC
)。这种方法行得通吗?@user3860311是的,它会行得通,但它不仅仅是与其他库链接,而且会引入更多错误或问题的来源。例如,考虑一下如果
libB
中的函数发生了更改,但您忘记更改包装器,会发生什么情况?是的,这就是我希望避免使用此类包装器的原因。我试图实现的是:
libB
是一个专有的EGL库,它缺少一些函数
libA
实现这些功能
libC
由两个库组成,并重命名为
libB
,因此任何应用程序都可以使用
libB
+缺少的函数。有没有其他方法可以做到这一点?