2011-07-07 47 views
1

我無法在3.9.0版本編譯反對OCILIB(libocilib.a)一些代碼:不能編譯反對OCILIB

$ LS
libocilib.a ocilib.h test.c的

$ gcc -o test -L。 -locilib test.c的
/tmp/cc4071VP.o:在功能 '主:
test.c的:(文本+ 0×27): 未定義參照 OCI_Initialize
test.c的:(文本+ 0x64 ):未定義 參照OCI_ConnectionCreate
test.c的:(文本+ 0x9d):未定義 參照OCI_StatementCreate
test.c的:(文本+ 0XAF):未定義 參照OCI_ExecuteStmt
test.c的:(.text + 0xb8):undefined 對OCI_GetResultset的引用
test.c :(.text + 0xcc) :未定義 參照OCI_GetString
test.c的:(文本+ 0xdd):未定義 參照OCI_FetchNext
test.c的:(文本+ 0xe6):未定義 參照OCI_Cleanup
collect2: LD返回1退出狀態

好的。在這種情況下:

$ strings libocilib.a | grep的 OCI_Initialize
OCI_Initialize
OCI_Initialize
OCI_Initialize
OCI_Initialize

有一個solution有關問題,他回答(文斯)本人在另一頁,但它不是爲我工作。

什麼DOES工作是當我嘗試編譯針對的.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 libs比它所需要的更多,它被試過了,沒有更多。說到這個,如果它有助於回答這個問題,那麼我編譯這個庫來進行運行時鏈接,已經將--with-oracle-import=runtime標誌傳遞給了./configure。

另一方面,在Windows 32位上發生類似的情況。沒有問題與Windows 64.我可以鏈接並運行一個程序對我自己編譯的libocilib.lib就好了。

希望我已經提供了足夠的線索......任何人都知道我做錯了什麼?
在此先感謝幫助。

回答

1

你試過這樣連接嗎?

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

至少在過去(我沒有做太多的C/C++在很長一段時間)的交聯要緊的順序。 test.o將提及OCI_Initializetest.o之後的libocilib.a,那些將被滿足。但是,如果您通過其他方式進行鏈接,則不會滿足這些引用,因爲鏈接器在查看test.o之前看到了OCI_Initialize符號,因此在查看test.o時從未意識到需要在符號周圍保留「指針」。

+0

gcc -o test test.c -L。鏈接dl也需要-locilib -ldl 。 謝謝! – yggdrasil