Eclipse-CDT в системе x86_64 не может связаться с общей библиотекой - PullRequest
2 голосов
/ 18 ноября 2011

Я скомпилировал несколько библиотек, используя Eclipse-CDT для Windows. Тем не менее, когда я пытался скомпилировать их под Linux, gcc продолжает выдавать ошибку /usr/bin/ld: cannot find -lrequestedLib. Я использую одни и те же настройки сборки между двумя средами (а именно, я обязательно добавил каталоги, которые содержат библиотеки, на которые мне нужно ссылаться). Я уверен, что система имеет права доступа для чтения файлов. Я не уверен, что с этим делать. Пожалуйста, помогите.

Edit: это команды, которые ecplise запускает для создания библиотеки:

gcc -I/home/me/lib/ -O3 -Wall -c -fmessage-length=0 -olibToMake.o ../libToMake.c 
gcc -L/home/me/lib/ -shared -olibToMake.so libToMake.o -lrequestedLib

Редактировать 2: команда, отображающая ошибку, является второй из двух, в результате чего выводится /usr/bin/ld: cannot find -lrequestedLib.

Редактировать 3: Я подтвердил, что требуемый файл Lib.so является двоичным файлом x86_64.

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

Я нашел это в другом месте, разделяемые библиотеки должны иметь lib в качестве префикса для ld, чтобы найти их. В противном случае их необходимо добавить в команду как /home/me/lib/requestedLib.so.

Ссылка: Как создать ссылку на общую библиотеку без префикса lib * в другом каталоге?

0 голосов
/ 18 ноября 2011

gcc -I/home/me/lib/ -O3 -Wall -c -fmessage-length=0 -olibToMake.o ../libToMake.c
gcc -L/home/me/lib/ -shared -olibToMake.so libToMake.o -lrequestedLib

При построении 64-битных разделяемых библиотек на x86_64 обычно требуется флаг -fPIC, или вы получаете recompile with -fPIC ошибка во время ссылки на совместно используемую библиотеку.

Поскольку вы не использовали -fPIC, но ваша ссылка была успешной, вы, вероятно, используете (не по умолчанию) gcc, который нацелен на i*86 (то есть, производит 32-битный выход).Вы можете подтвердить это, запустив file libToMake.so.

Вы не показали ту команду, что на самом деле терпит неудачу (та, которая вызывает cannot find -lrequestedLib ошибку).Я предполагаю, что , команда использует другой gcc (по умолчанию?), Который нацелен на x86_64.Если она выглядит примерно так:

gcc main.c -L/home/me/lib -lrequestedLib

, эта команда будет игнорировать /home/me/lib/librequestedLib.so (поскольку вы не можете связать 32-битный и 64-битный код) и продолжит поискlibrequestedLib в другом месте.Когда он не может найти 64-битную версию librequestedLib, он выдаст сообщение об ошибке, которое вы получаете.

0 голосов
/ 18 ноября 2011

Если вы не хотите передавать параметры командной строки -L в gcc(1), обязательно добавьте путь, содержащий библиотеки, в /etc/ld.so.conf или /etc/ld.so.cond.d/<something>.

.Установив свои библиотеки, вы также должны запустить ldconfig(8) вручную.(Большинство новых пользователей забывают об этом шаге, потому что типичные менеджеры пакетов позаботятся об этом при установке новых библиотек.)

...