2011-04-08 60 views
1

亲爱的, 这是我的命令链接库,并生成一个EXE:LD未链接

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 

但是当我运行命令未能找到从归档文件中readg_x.o使用的功能libtabs.a。这里有错误,如:

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' 
+0

这不是lds故障。你的代码有问题。也许你正在使用一个变量/函数,它是在一个头文件中导出的,但并未实现。 – halfdan 2011-04-08 13:22:49

+0

感谢Haldan的回复。那么所有这些功能都实现了。 – QMG 2011-04-08 14:02:47

回答

1

该错误是指图书馆libtabs.a不包含你的想法。您可以使用像objdump这样的工具来列出库中定义的所有符号,以确保您期望的是真实的。

+0

谢谢亚伦。我用nm命令检查过这些符号是在libtabs.a中定义的 – QMG 2011-04-08 14:05:28

+0

您是否在头文件中定义了它们,以便在'readg_x.c'中已知类型? 'readg_x.c'和C源文件中的类型是否相同?编译为'libtabs.a'?如果你编写一个包含“options”的小C文件并将其添加到'ld'命令,会发生什么? – 2011-04-08 15:58:17

+0

我已经检查过一个小型的c程序,它被编译并执行:( – QMG 2011-04-12 07:24:01

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的输出,很难告诉究竟发生了什么,但是您断言该库中定义的符号肯定是错误的。
+0

亲爱的ER,谢谢你的回复。这里是你告诉readelf -s libtabs命令的输出。a | grep oraconnect 77:0000000000000647 860 FUNC GLOBAL DEFAULT 1 oraconnect 87:00000000000009fc 634 FUNC GLOBAL DEFAULT 1 oraconnect_ret我正在编译-o,但它也给出相同的错误 – QMG 2011-04-12 06:47:25