我在 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 的程序就好了。
希望我提供了足够的线索......有人知道我做错了什么吗?
提前感谢帮助。