1

我在 3.9.0 版上针对 ocilib (libocilib.a) 编译一些代码时遇到问题:

$ ls
libocilib.a ocilib.h test.c

$ gcc -o 测试 -L。-locilib test.c
/tmp/cc4071VP.o:在函数“main”中:
test.c:(.text+0x27):未定义对 OCI_Initialize
test.c:(.text+0x64) 的引用:未定义对 OCI_ConnectionCreate
测试的引用。 c:(.text+0x9d): 未定义引用 OCI_StatementCreate
test.c:(.text+0xaf): 未定义引用 OCI_ExecuteStmt
test.c:(.text+0xb8): 未定义引用 OCI_GetResultset
test.c:(.text +0xcc):对 OCI_GetString 的未定义引用
test.c:(.text+0xdd):对 OCI_FetchNext 的未定义引用
test.c:(.text+0xe6):对 OCI_Cleanup 的未定义引用
collect2:ld 返回 1 个退出状态

行。在这种情况下:

$ 字符串 libocilib.a | grep OCI_Initialize
OCI_Initialize
OCI_Initialize
OCI_Initialize
OCI_Initialize

该人(文斯)自己在另一页上回答了这个问题的解决方案,但它对我不起作用。

当我尝试针对 .so 进行编译时,它的工作原理是

$ ls
libocilib.so* libocilib.so.3* libocilib.so.3.9.0* ocilib.h test.c

$ gcc -o 测试 -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 的程序就好了。

希望我提供了足够的线索......有人知道我做错了什么吗?
提前感谢帮助。

4

1 回答 1

1

您是否尝试过像这样链接它?

gcc -o test test.c -L. -locilib

至少在过去(我很久没有做过太多 C/C++ 了)链接的顺序很重要。 test.o之后会有对OCI_Initializelibocilib.a的引用test.o,这些都会得到满足。但是,如果您以其他方式链接这些引用,则不会满意,因为链接器在OCI_Initialize查看符号之前就看到了该符号test.o,因此从未意识到它需要在查看时保留一个指向该符号的“指针” test.o

于 2011-07-08T00:04:38.263 回答