не удалось связать - PullRequest
       54

не удалось связать

1 голос
/ 08 апреля 2011

Дорогие все, Вот моя команда для связывания библиотек и создания EXE:

ld -o readgfile  readg_x.o MedLib_x.o cdrsort.o mtcprc.o encoder.o mtcbuil.o dbtprc.o dbtbuil.o  DFMLIB_x.o Dyn_SQL_x.o /home/med/src/api/libnapi.a  /home/med/src/api/libtabs.a $ORACLE_HOME/lib/libclntsh.so

Но когда я запустил команду, она не смогла найти функцию, используемую в readg_x.o, из файла, заархивированного в libtabs.a. Вот ошибка как:

readg_x.o: In function `main':
/home/med/src/readg/readg_x.c:565: undefined reference to `options'
/home/med/src/readg/readg_x.c:570: undefined reference to `oraconnect'
/home/med/src/readg/readg_x.c:591: undefined reference to `oracommit'

Ответы [ 2 ]

1 голос
/ 10 апреля 2011

У вас есть две проблемы:

  1. Вы пытаетесь создать исполняемый файл с ld.Как только вам удастся на самом деле связать его, результирующий исполняемый файл будет аварийно завершать работу при запуске, потому что вы неправильно связываетесь при запуске C (crt0.o).В UNIX / Linux нужно никогда использовать ld, чтобы связать что-либо (за редким исключением связывания ядра ОС или загрузчика).Вы должны всегда использовать вместо этого драйвер компилятора, например: gcc -o readgfile readg_x.o MedLib_x.o ...
  2. Даже если вы заявили, что oraconnect и т. Д. Определены в libtabs.a, они не (или впо крайней мере, они не определены как глобальные символы).Без вывода readelf -s libtabs.a | grep oraconnect трудно точно сказать , что происходит, но ваше утверждение о том, что символы определены в этой библиотеке, определенно неверно.
1 голос
/ 08 апреля 2011

Ошибка означает, что библиотека libtabs.a не содержит того, что вы думаете. Вы можете использовать такие инструменты, как objdump, чтобы вывести список всех символов, определенных в библиотеке, чтобы убедиться, что вы ожидаете того, что есть на самом деле.

...