无法针对 OCILIB 进行编译

标签 c oracle static-libraries linker-errors oracle-call-interface

我在针对版本 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/

相关文章:

c - 了解声明 C 字符串的两种方式

oracle - ServiceStack 中的 Dapper 和 OrmLite IDBConnectionFactory

static-libraries - 如何在 Linux 上列出静态库的所有外部 undefined symbol ?

ios - 使用 XCTestCase 进行静态库测试

c - 一个 fgets 实现中出现段错误,但另一类似实现中则没有

c - 为什么不建议在 C 中使用指针进行数组访问

c - 期待编译错误

java - SQLDeveloper 运行查询但从 hibernate 中获取 "ORA-00979: Not a Group By expression"

sql - 在 oracle 9i 中查找可以为空的列会抑制列的索引吗?

c++ - ctypes,添加静态库时 undefined symbol