在3.9.0版上,我无法针对ocilib(libocilib.a)编译一些代码:
$ls美元
libocilib.a ocilib.h测试.c
$gcc-o测试-L.-locilib测试.c
/tmp/cc4071VP.o:功能中
`main':测试.c:(.text+0x27):
未定义对的引用
OCI_初始化
test.c:(.text+0x64):未定义
引用OCI_ConnectionCreate
测试c:(.text+0x9d):未定义
引用OCI_语句create
test.c:(.text+0xaf):未定义
参考OCI_ExecuteStmt
test.c:(.text+0xb8):未定义
引用OCI_GetResultset
test.c:(.text+0xcc):未定义
引用OCI\u GetString
test.c:(.text+0xdd):未定义
引用OCI_FetchNext
测试c:(.text+0xe6):未定义
参考OCI U清理集合2:
返回1退出状态
好 啊。在这种情况下:
$strings libocilib.a | grep字符串
初始化
初始化
OCI_初始化
在另一页上,这个问题的答案是文斯自己,但这对我不起作用。
当我试图针对.so编译时,什么才是有效的:
$ls libocilib.so*
libocilib.so.3*libocilib.so.3.9.0*
ocilib.h测试c
$gcc-o测试-L.-locilib测试.c
$
程序也按预期运行(当然,在修改LD_LIBRARY_PATH之后!).
前面提到的解决方案包括我尝试过的两个定义-DOCI_IMPORT_LINKAGE
和-DOCI_CHARSET_ANSI
(尽管在线文档说DOCI_IMPORT_链接只在编译库本身时使用)。我认为这与实际oracle libs的链接有关,而与ocilib无关。已经试过了,一点也不差。
说到这里,如果有助于回答这个问题,我将库编译为具有运行时链接,并将--with-oracle-import=runtime
标志传递到./configure。
还有一点需要注意的是,类似的事情在Windows32位上也会发生。Windows 64没有问题。我可以链接并运行一个针对我自己编译的libocilib.lib的程序。
希望我已经提供了足够的线索。。。有人知道我做错了什么吗?
提前谢谢你的帮助。
最佳答案
你试过这样链接吗?
gcc -o test test.c -L. -locilib
至少在过去(我很久没有做过很多C/C++)了,链接的顺序很重要。
test.o
将引用OCI_Initialize
和libocilib.a在test.o
之后,这些都将得到满足。但是,如果你用另一种方式链接这些引用,你会不满意,因为链接器在查看OCI_Initialize
之前看到了test.o
符号,因此从来没有意识到在查看test.o
时需要保留一个指向符号的“指针”。