【发布时间】:2013-01-09 10:49:12
【问题描述】:
我有一个共享库,比如 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
【问题讨论】:
-
您应该显示 (a) 用于构建
file1.so的命令行和 (b) 用于构建可执行文件的命令行。两者都是相关的,因为您可能已经将file1.so需要file2.so的信息与 (a) 的答案一起构建到file1.so中,并且无论如何,有一些方法可以避免 (b) 中的问题。请注意,一个共享库(例如file2.so)中的函数调用另一个共享库(例如libc.so)中的函数是正常的。或者考虑使用libc.so的libncurses.so;等等。 -
我将 main.c 链接到 libfile1.so,其中包含 print1() 的定义,但 print1() 调用 print2(),其定义在 libfile2.so 中。
-
您应该编辑您的问题以包含该信息,并且您应该完整显示命令行。另外,您的问题讨论了
file1.so;您的评论讨论了libfile1.so。命名约定之间有很多差异。lib前缀允许在链接器命令行上使用-lfile1表示法。没有那个前缀,你就不能使用速记;您必须在链接线上指定共享对象的路径。在对答案的评论中还提到了动态加载。这也应该是问题的一部分;它也改变了很多事情。
标签: c shared-libraries