Подтвердить что ты не робот

Создание и объединение общей библиотеки

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, но это тоже не работает

4b9b3361

Ответ 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

Обратите внимание, что библиотека, на которую вы ссылаетесь, должна быть помещена после объекта/исходного файла с использованием ее символов - иначе линкер может не найти символы.