Я работаю с большим кодом 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*,
jpeg_std_error (jpeg_error_mgr *)»
int, bool, bool) const':
Grid.cpp:(.text._ZNK3program20GridIdE9SaveToJPGEPKcibb[program::Grid<double>::SaveToJPG(char
const*, int, bool, bool) const]+0x499): undefined reference to
Grid.cpp :(. Text._ZNK3program20GridIdE9SaveToJPGEPKcibb [Программа :: Сетка :: SaveToJPG (голец
const *, int, bool, bool) const] + 0x4b5): неопределенная ссылка на
`jpeg_CreateCompress (jpeg_compress_struct *, int, unsigned long) ‘
Что я пробовал:
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-файла:
Вот что я изменил:
-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 *)»
и так далее…
В продолжение комментариев: вы уверены, что установили 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» в соответствующих местах.
(Конец редактирования по Матс)
Других решений пока нет …