Не могу скомпилировать против OCILIB - PullRequest
1 голос
/ 07 июля 2011

У меня проблемы с компиляцией кода для ocilib (libocilib.a) в версии 3.9.0:

$ ls
libocilib.a ocilib.h test.c

$ gcc -o test -L.-locilib test.c
/tmp/cc4071VP.o: в функции `main ':
test.c :(. text + 0x27): неопределенная ссылка на OCI_Initialize
test.c :(. text +0x64): неопределенная ссылка на OCI_ConnectionCreate
test.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 состояние выхода

ОК.В этом случае:

$ strings 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 test -L.-locilib test.c
$

Программа также работает должным образом (конечно, после изменения LD_LIBRARY_PATH!).

Решение, упомянутое ранее, включает в себя некоторые определения -DOCI_IMPORT_LINKAGE и -DOCI_CHARSET_ANSI Я пытался использовать оба из них (хотя онлайн-документы говорят, что DOCI_IMPORT_LINKAGE используется только при компиляции самой библиотеки. Я предположил, что это больше относится к компоновке реальных библиотек оракула, чем к ocilib.Это было опробовано, тем не менее.

Говоря о том, что, если это поможет ответить на вопрос, я скомпилировал библиотеку для связывания во время выполнения, передав флаг --with-oracle-import=runtime в ./configure.

Еще одно замечание: что-то похожее происходит в 32-битной Windows. Никаких проблем с Windows 64. Я могу связать и запустить программу с моим собственным скомпилированным libocilib.lib просто отлично.

Надеюсь, у меня естьпредоставил достаточно подсказок ... кто-нибудь знает, что я делаю не так?
Заранее спасибо, помогите.

1 Ответ

1 голос
/ 08 июля 2011

Вы пробовали связать это так?

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

По крайней мере, в прошлом (я давно не делал много C / C ++) порядок связи имел значение. test.o будет иметь ссылки на OCI_Initialize, а с libocilib.a после test.o они будут удовлетворены. Но если вы сошлись с другой стороны, эти ссылки не были бы удовлетворены, потому что компоновщик видел символ OCI_Initialize до того, как он посмотрел на test.o, и поэтому никогда не осознавал, что нужно держать «указатель» на символ вокруг при взгляде на test.o.

...