Создание и объединение общей библиотеки
im пытается создать общую библиотеку на платформе windows cygwin с помощью g++, а затем связать ее с другим файлом cpp:
Я использую следующие команды:
// generate object file
g++ -g -c -Wall -fPIC beat11.cpp -o beat11.o
// to generate library from the object file
g++ -shared -Wl,-soname,libbeat.so.1 -o libbeat.so.1.0.1 beat11.o -lc
// to link it with another cpp file; -I option to refer to the library header file
g++ -L. -lbeat -I . -o checkbeat checkbeat.cpp
при связывании появляется следующая ошибка:
/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld:
cannot find -llibbeat.so.1.0.1
collect2: ld returned 1 exit status
библиотека создается только отлично, но я могу найти только libbeat.so.1.0.1, а не libbeat.so или libbeat.so.1 (или они не должны быть там?)
один из других вопросов предполагает создание символической ссылки на libbeat.so.1.0.1, но это тоже не работает
Ответы
Ответ 1
При использовании -l<libname>
для указания библиотеки для ссылки компоновщик сначала ищет lib<libname>.so
перед поиском lib<libname>.a
.
В вашем случае это не работает, потому что имя файла библиотеки не имеет суффикса .so
.
Вы можете создать simlink
libbeat.so -> libbeat.so.1.0.1
или
libbeat.so -> libbeat.so.1
libbeat.so.1 -> libbeat.so.1.0.1
Вы также можете использовать -l:libbeat.so.1.0.1
(если ваш компоновщик поддерживает его, проверьте man ld
описание параметра -l
). Другой вариант - указать библиотеку без -l
g++ -o checkbeat checkbeat.cpp -I . -L. libbeat.so.1.0.1
Обратите внимание, что библиотека, на которую вы ссылаетесь, должна быть помещена после объекта/исходного файла с использованием ее символов - иначе линкер может не найти символы.