LD未链接
问题描述:
亲爱的, 这是我的命令链接库,并生成一个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'
答
该错误是指图书馆libtabs.a
不包含你的想法。您可以使用像objdump
这样的工具来列出库中定义的所有符号,以确保您期望的是真实的。
答
你有两个问题:
- 你正在试图建立一个可执行文件
ld
。一旦设法实际将其链接起来,由此产生的可执行文件将在启动时崩溃,因为您在C启动时没有正确链接(crt0.o
)。在UNIX/Linux上,应该使用从不使用使用ld
来链接任何东西(连接OS内核或引导加载程序的罕见例外)。你应该总是使用编译器驱动程序,而不是像这样:gcc -o readgfile readg_x.o MedLib_x.o ...
- 即使你声称
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
这不是lds故障。你的代码有问题。也许你正在使用一个变量/函数,它是在一个头文件中导出的,但并未实现。 – halfdan 2011-04-08 13:22:49
感谢Haldan的回复。那么所有这些功能都实现了。 – QMG 2011-04-08 14:02:47