亲爱的, 这是我链接库并生成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'
答案 0 :(得分:1)
错误意味着库libtabs.a
不包含您的想法。您可以使用objdump
之类的工具列出库中定义的所有符号,以确保您期望的是什么。
答案 1 :(得分:1)
你有两个问题:
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
的输出,很难说完全发生了什么,但是你在这个库中定义符号的断言肯定是假的。