Ошибки связывания в Linux gcc 4.3.4: & quot; неопределенная ссылка & quot; относится к & quot; jpeg & quot; библиотека (например, неопределенная ссылка на `jpeg_std_error (jpeg_error_mgr *) ‘)

Я работаю с большим кодом C ++, который был разработан в течение нескольких лет. Я добавил код и успешно запускаю его на Mac OX 10.7.5. Однако он очень медленный, и теперь я хочу запустить его в кластере (g ++ (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973]). Я не очень опытен в C ++, и я новичок в том, что касается компиляции / компоновки.

Я не могу пройти мимо ошибки компоновки, связанной с библиотекой «jpeg», и буду очень признателен за любую помощь. У меня установлен код библиотеки в каталоге, где находится мой код, но я понимаю, что он также доступен из компилятора.

Есть много сообщений об ошибках, поэтому я не буду публиковать все это. Вот первая часть:

/data/place/number/account/program/libraries/libfile_intel.a(Grid.o):
В функции program::Grid<double>::SaveToJPG(char const*,
int, bool, bool) const':
Grid.cpp:(.text._ZNK3program20GridIdE9SaveToJPGEPKcibb[program::Grid<double>::SaveToJPG(char
const*, int, bool, bool) const]+0x499): undefined reference to
jpeg_std_error (jpeg_error_mgr *)»
Grid.cpp :(. Text._ZNK3program20GridIdE9SaveToJPGEPKcibb [Программа :: Сетка :: SaveToJPG (голец
const *, int, bool, bool) const] + 0x4b5): неопределенная ссылка на
`jpeg_CreateCompress (jpeg_compress_struct *, int, unsigned long) ‘

Что я пробовал:

  • Когда я сделал поиск в Google по этой проблеме, я обнаружил из старого сообщения на форуме, что библиотека jpeg компилируется в C. Это, очевидно, заставляет компилятор C ++ путать имена. Мне не ясно, что это значит, но я последовал совету добавить:

extern «C» {
#include «jpeglib.h»}

во всех файлах в моем каталоге jpeg, которые содержат «#include» jpeglib.h. «Я написал» jpeglib.h «, потому что, как я уже упоминал, у меня есть каталог, содержащий код jpeg. Однако я также попытался используйте код jpeg, предоставленный по умолчанию, и я получил сообщение о том, что он недоступен в кластерном компиляторе.

  • В моем make-файле я проверил все мои включения и пути. Это, похоже, не проблема. Кроме того, у меня есть аналогичные пути и включения для других библиотек в других каталогах, и они в порядке.

  • Я также добавил: -lstdc ++ в мой список опций компилятора (из советов в другом старом сообщении на форуме). Это имело нулевой эффект.

Одно странное наблюдение, которое я сделал, заключается в том, что когда я делаю «make» из всего кода (несколько библиотек в разных каталогах), библиотека jpeg не делает, если я специально не захожу в ее каталог и не делаю там «make». Как я уже сказал, код слишком велик, чтобы публиковать его, чтобы продемонстрировать, что у меня нет ошибок пути. Я почти уверен, что нет, но такое поведение кажется очень странным.

Если после этого длинного поста кто-нибудь еще будет со мной, я буду очень признателен за любые советы. Благодарю.

Редактировать:
В моем make-файле вот что у меня есть для компиляции / компоновки:

CC = g ++

OPTIONS = -O3 -fpermissive -w -DSAMG_UNIX_LINUX -DSAMG_LCASE_USCORE
-DNDEBUG -DCSP_WITH_SAMG_SOLVER

Редактировать 2: результат совета Свенса

Я сделал:

найти / usr / opt -iname libjpeg * так *

И получил:

/usr/lib/libjpeg.so.62

/usr/lib/libjpeg.so.62.0.0

/usr/lib64/libjpeg.so.62

/usr/lib64/libjpeg.so.62.0.0

/usr/lib64/libjpeg.so найти:

/usr/lib64/mozilla': Permission denied find:
/ usr / lpp / mmfs / gui / runtime ‘: в доступе отказано
мне @ login1: / данные / место / номер / счет / программа / support_libraries / JPEG>
cd ../../libraries/
me @ login1: / данные / место / номер / учетная запись / программа / библиотеки> найти $ HOME
-имя libjpeg * так *

Если мое понимание верно, библиотека существует и была найдена в каталоге «библиотеки», где я и ожидаю. Мой основной make-файл, который связывает все библиотеки, имеет путь включения к каталогу, в котором находится библиотека jpeg. Другие библиотеки в этом каталоге найдены. Что делает «отказано в разрешении»?

Редактировать 3: результат совета Свена об изменении параметров make-файла:

Вот что я изменил:

  • Сначала добавили «-lgems3k -L / usr / lib -ljpeg» в мои LIBS (библиотеки). Это приводит к ошибкам ниже.
  • Затем добавлено (приводит к той же ошибке, что и оригинал):
    OPTIONS = -O3 -fpermissive -w -DSAMG_UNIX_LINUX -DSAMG_LCASE_USCORE -DNDEBUG -DCSP_WITH_SAMG_SOLVER — / usr / lib / libjpeg.so.62

-L / usr / lib -ljpeg /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld:

Пропуск несовместимого /usr/lib/libm.so при поиске -lm

/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld:

Пропуск несовместимого /usr/lib/libm.a при поиске -lm

/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld:

Пропуск несовместимого /usr/lib/libc.so при поиске -lc

/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld:

Пропуск несовместимого /usr/lib/libc.a при поиске -lc

/data/place/number/account/program/libraries/lib1_intel.a(Grid.o): в

function `program :: Grid :: SaveToJPG (char const *, int, bool,
bool) const ‘:

Grid.cpp :(. Text._ZNK3program20GridIdE9SaveToJPGEPKcibb [Программа :: Сетка :: SaveToJPG (голец
const *, int, bool, bool) const] + 0x499): неопределенная ссылка на
`Jpeg_std_error (jpeg_error_mgr *)»

и так далее…

1

Решение

В продолжение комментариев: вы уверены, что установили libjpeg? Бежать

find $HOME -iname libjpeg\*so\*

чтобы найти libjpeg, на который вам нужно сослаться. Эта команда, скорее всего, даст несколько результатов.

Вы можете просто взять первую строку этого вывода и добавить ее к своей команде компиляции, но пропустите предложенный выше «-ljpeg».

Если он вообще не выдает никаких результатов, у вас дома не установлена ​​библиотека libjpeg. Так что либо

  • установить libjpeg

  • отключите ту часть кода, которая в ней нуждается, если она вам тоже не нужна

  • расширить поиск,

лайк

find /usr /opt -iname libjpeg\*so\*

… и попробуйте с одной из установок libjpeg в системе.

РЕДАКТИРОВАТЬ (после того, как libjpeg был найден в системе):

Попробуйте добавить

/usr/lib/libjpeg.so.62

к команде компиляции ( ОПЦИИ переменная в вашем Makefile). Если это не сработает, попробуйте

-L/usr/lib -ljpeg

(Отредактировано Mats 🙂

Также убедитесь, что КАЖДОЕ место, где #include "jpeglib.h" покрыто extern "C" { ... }, Возможно, имеет смысл заменить их на оболочку с ++, включающую добавление extern "C" { ... } в одном месте, а затем просто включите «wrapped_jpeglib.h» в соответствующих местах.

(Конец редактирования по Матс)

5

Другие решения

Других решений пока нет …