2013-01-09 38 views
2

我有一个共享库说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 
+0

您应该显示(a)用于构建'file1.so'的命令行和(b)用于构建可执行文件的命令行。两者都是相关的,因为您可能已经将(file1.so)需要'file2.so'的信息构建到'file1.so'中并且答案(a),并且无论如何,都有办法避免( b)。请注意,一个共享库(例如'file2.so')中的函数调用另一个共享库(例如'libc.so')中的函数是正常的。或者考虑使用'libc.so'的'libncurses.so';等等。 –

+0

我将main.c链接到包含print1()的定义的libfile1.so,但print1()调用其定义在libfile2.so中的print2()。 – Sunil

+0

您应该编辑您的问题以包含该信息,并且应该完整显示命令行。另外,你的问题讨论'file1.so';你的评论讨论'libfile1.so'。命名约定有很多不同之处。 'lib'前缀允许在链接器命令行上使用'-lfile1'表示法。没有这个前缀,你不能使用简写;您必须指定链接线上共享对象的路径。在评论中还提到了动态加载的答案。这也应该是问题的一部分;它也改变了很多东西。 –

回答

3

如果只print1main.c调用。然后在LD_LIBRARY_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.cprint1print2然后链接都libfile1.solibfile2.so像下面。

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

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

+0

好吧,我明白我需要链接两个.so文件,但为什么我得到的错误,我提到的问题,如果链接发生在运行时? – Sunil

+0

@Sunilbn:更新我的回答 – rashok

+0

在main.c中,我调用print1()函数(它在libfile1.so中),后者又调用print2()函数(它位于libfile2.so中)。那么为什么我应该链接两个.so文件?此外,这些符号应该在运行时正确解析,因为我们正在使用共享对象(动态链接)? – Sunil

相关问题