我在针对版本 3.9.0 上的 ocilib (libocilib.a) 编译一些代码时遇到问题:
$ ls
libocilib.a ocilib.h test.c$ gcc -o test -L. -locilib test.c
/tmp/cc4071VP.o: In function `main':
test.c:(.text+0x27): undefined reference to OCI_Initialize
test.c:(.text+0x64): undefined reference to OCI_ConnectionCreate
test.c:(.text+0x9d): undefined reference to OCI_StatementCreate
test.c:(.text+0xaf): undefined reference to OCI_ExecuteStmt
test.c:(.text+0xb8): undefined reference to OCI_GetResultset
test.c:(.text+0xcc): undefined reference to OCI_GetString
test.c:(.text+0xdd): undefined reference to OCI_FetchNext
test.c:(.text+0xe6): undefined reference to OCI_Cleanup
collect2: ld returned 1 exit status
好的。在那种情况下:
$ strings libocilib.a | grep OCI_Initialize
OCI_Initialize
OCI_Initialize
OCI_Initialize
OCI_Initialize
有一个solution这个问题由那个人(文斯)自己在另一页上回答,但它对我不起作用。
当我尝试针对 .so 进行编译时,会 起作用:
$ ls
libocilib.so* libocilib.so.3* libocilib.so.3.9.0* ocilib.h test.c$ gcc -o test -L. -locilib test.c
$
程序也按预期运行(当然是在修改 LD_LIBRARY_PATH 之后!)。
前面提到的解决方案包括一些定义 -DOCI_IMPORT_LINKAGE
和 -DOCI_CHARSET_ANSI
我已经尝试过这两个(即使在线文档说 DOCI_IMPORT_LINKAGE 仅在编译库本身。我曾假设它更多地与实际 oracle 库的链接有关,而不是 ocilib。尽管如此,它还是被尝试过。
说到这里,如果它有助于回答问题,我将库编译为具有运行时链接,并将 --with-oracle-import=runtime
标志传递到 ./configure。
还有一个旁注,类似的事情发生在 Windows 32 位上。 Windows 64 没有问题。我可以针对我自己编译的 libocilib.lib 链接并运行程序。
希望我已经提供了足够的线索...有人知道我做错了什么吗?
在此先感谢帮助。
最佳答案
你试过这样链接吗?
gcc -o test test.c -L. -locilib
至少在过去(我很长一段时间没有做过多少 C/C++)链接的顺序很重要。
test.o
将引用 OCI_Initialize
并在 test.o
之后使用 libocilib.a,这些将得到满足。但是,如果您以其他方式链接,这些引用将不会得到满足,因为链接器在查看 test.o
之前看到了 OCI_Initialize
符号,因此从未意识到它需要保留查看 test.o
时指向周围符号的“指针”。
关于无法针对 OCILIB 进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6613728/