ld无法链接

时间:2011-04-08 13:20:35

标签: linux gcc linker ld

亲爱的, 这是我链接库并生成exe的命令:

ld -o readgfile  readg_x.o MedLib_x.o cdrsort.o mtcprc.o encoder.o mtcbuil.o dbtprc.o dbtbuil.o  DFMLIB_x.o Dyn_SQL_x.o /home/med/src/api/libnapi.a  /home/med/src/api/libtabs.a $ORACLE_HOME/lib/libclntsh.so

但是当我运行命令时,它无法从libtabs.a中存档的文件中找到readg_x.o中使用的函数。以下是错误:

readg_x.o: In function `main':
/home/med/src/readg/readg_x.c:565: undefined reference to `options'
/home/med/src/readg/readg_x.c:570: undefined reference to `oraconnect'
/home/med/src/readg/readg_x.c:591: undefined reference to `oracommit'

2 个答案:

答案 0 :(得分:1)

错误意味着库libtabs.a不包含您的想法。您可以使用objdump之类的工具列出库中定义的所有符号,以确保您期望的是什么。

答案 1 :(得分:1)

你有两个问题:

  1. 您正在尝试使用ld构建可执行文件。一旦您设法实际链接它,生成的可执行文件将在启动时崩溃,因为您没有在C启动(crt0.o)中正确链接。在UNIX / Linux上,应该从不使用ld链接任何东西(链接OS内核或引导加载程序的常见情况除外)。您应该总是使用编译器驱动程序,如下所示:gcc -o readgfile readg_x.o MedLib_x.o ...
  2. 即使您声称在oraconnect中定义了libtabs.a等,但它们不是(或者至少它们未被定义为全局符号)。如果没有readelf -s libtabs.a | grep oraconnect的输出,很难说完全发生了什么,但是你在这个库中定义符号的断言肯定是假的。