Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.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_Shared Libraries - Fatal编程技术网

C 一个共享库中的函数调用另一个共享库中的函数

C 一个共享库中的函数调用另一个共享库中的函数,c,shared-libraries,C,Shared Libraries,我有一个共享库,比如libfile2.so(包含print2()函数定义)。现在,我创建了一个libfile1.so(它包含print1()函数定义,反过来调用libfile2.so中的print2()函数)。现在我创建了一个main.c文件,其中包含main()函数,该函数通过动态链接libfile1.so调用print1() 但我得到了以下错误: ./libfile1.so: undefined reference to `print2'** 以下是我正在使用的命令: gcc -c -fp

我有一个共享库,比如libfile2.so(包含print2()函数定义)。现在,我创建了一个libfile1.so(它包含print1()函数定义,反过来调用libfile2.so中的print2()函数)。现在我创建了一个main.c文件,其中包含main()函数,该函数通过动态链接libfile1.so调用print1()

但我得到了以下错误:

./libfile1.so: undefined reference to `print2'**
以下是我正在使用的命令:

gcc -c -fpic file1.c
gcc -shared -o libfile1.so file1.o
gcc -c -fpic file2.c
gcc -shared -o libfile2.so file2.o
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
gcc -I. -L. -o main main.c -lfile1

如果在
main.c
中只调用了
print1
。然后在
LD\u LIBRARY\u path
中设置
libfile2.so的路径。因为它将在链接
main.c
时尝试查找
libfile1.so的依赖项

gcc -o file1.o -c file.c
gcc -o file2.o -c file.c
gcc -o libfile2.so file2.o -shared
gcc -o libfile1.so file1.o -L. -lfile2 -shared
gcc -o main.o -c main.c
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
gcc -o main.exe main.o -L. -lfile1 
如果您在
main.c
中同时调用了
print1
print2
,则链接
libfile1.so
libfile2.so
,如下所示

gcc -o main.o -c main.c
gcc -o main.exe main.o -L$YOUR_LIB_PATH -lfile1 -lfile2

因为在生成可执行文件时,main.c中使用的所有符号都需要解析。

好的,我知道我需要链接这两个.so文件,但如果链接发生在运行时,为什么会出现我在问题中提到的错误?在main.c中,我调用print1()函数(在libfile1.so中),它反过来调用print2()函数(位于libfile2.so中)。那我为什么要链接这两个.So文件呢?。此外,符号应该在运行时正确解析,因为我们使用的是共享对象(动态链接)?@Sunilbn:在这种情况下,不需要链接
lfile2
。仅链接
lfile1
但在此之前,请将
lfile2
的路径设置为
LD_LIBRARY_路径
是的,我已将lfile1和lfile2的路径设置为LD_LIBRARY_路径,但仍然收到相同的错误。我还有一个问题,为什么链接应该在编译时发生,它应该在运行时发生,对吗?嘿,我明白了:)。在创建libfile1.so时,我们需要将libfile1.so与libfile2.so链接,然后我们只能将main.c与libfile1.so链接。非常感谢您的指导。您应该显示(a)用于构建
文件1的命令行。因此
和(b)用于构建可执行文件的命令行。这两者都是相关的,因为您可能已经将
file1.so
需要
file2.so
的信息构建到
file1.so
中,并回答了(a),并且在任何情况下,都有避免(b)中问题的方法。请注意,一个共享库(例如
file2.so
)中的函数调用另一个共享库(例如
libc.so
)中的函数是正常的。或者考虑<代码> LIN诅咒。所以使用<代码> LBC.SO ;依此类推。我正在将main.c链接到libfile1.so,其中包含print1()的定义,但print1()调用了print2(),其定义在libfile2.so中。您应该编辑问题以包含该信息,并且应该完整显示命令行。另外,您的问题讨论了
file1.so
;您的评论讨论了
libfile1.so
。命名约定之间有很大的不同。
lib
前缀允许在链接器命令行上使用
-lfile1
符号。没有这个前缀,你就不能使用速记;必须在链接线上指定共享对象的路径。在对答案的评论中也提到了动态加载。这也是问题的一部分;它也改变了很多事情。