【问题标题】:function in one shared library calling a function in another shared library一个共享库中的函数调用另一个共享库中的函数
【发布时间】:2013-01-09 10:49:12
【问题描述】:

我有一个共享库,比如 libfile2.so(其中包含 print2() 函数定义)。现在我创建一个 libfile1.so(其中包含 print1() 函数定义,该定义又调用 libfile2.so 中的 print2() 函数)。现在我创建一个 ma​​in.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


【解决方案1】:

如果您在main.c 中只调用了print1。然后在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.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_PATH
  • 是的,我已将 lfile1 和 lfile2 的路径设置为 LD_LIBRARY_PATH 但我仍然收到相同的错误。我还有一个问题,为什么链接应该在编译时发生,它应该在运行时发生,对吧?
  • 嘿,我明白了:)。在创建 libfile1.so 时,我们需要将 libfile1.so 与 libfile2.so 链接,然后我们只能将 main.c 与 libfile1.so 链接。非常感谢您的指导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2011-08-27
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多