Создание и использование разделяемой библиотеки (Создал, а использовать не могу)

Модератор: Модераторы разделов

DTF
Сообщения: 98

Создание и использование разделяемой библиотеки

Сообщение DTF »

Здравствуй, all!

Пытаюсь сделать динамическую библиотеку и бинарь, который подгружает ее при запуске и потом использует. И не могу скомпилировать бинарь.
Заголовочный файл библиотеки (lib2.h):

Код: Выделить всё

void Func2();


Исходник библиотеки (lib2.cpp):

Код: Выделить всё

#include <iostream>

void Func2() {
    std::cout << "Func2" << std::endl;
}


Исходник бинарнка (main.cpp):

Код: Выделить всё

#include "lib2/lib2.h"

int main() {
    Func2();
    return 0;
}


lib2.cpp и lib2.h находятся в каталоге lib2/, который лежит рядом с main.cpp

Собираю я все это вот таким скриптом:

Код: Выделить всё

#!/bin/bash

rm -rf build && mkdir build &&

g++ -Wall -c -fpic -o build/lib2.o lib2/lib2.cpp &&
g++ -shared -o liblib2.so build/lib2.o &&

rm -rf main &&
g++ -Wall -o main -L"." -llib2 main.cpp


И получаю ошибку
/tmp/ccVDumoI.o: In function `main':
main.cpp:(.text+0x5): undefined reference to `Func2()'
collect2: error: ld returned 1 exit status


ЧЯДНТ?
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE

Re: Создание и использование разделяемой библиотеки

Сообщение FlySnake »

Префикс lib в имени библиотеки линкеру не нужно указывать. В Вашем случае попробуйте собирать бинарник так: g++ -Wall -o main -L"." -l2 main.cpp
Спасибо сказали:
DTF
Сообщения: 98

Re: Создание и использование разделяемой библиотеки

Сообщение DTF »

FlySnake писал(а):
24.08.2014 09:33
Префикс lib в имени библиотеки линкеру не нужно указывать.


Так это не префикс, это название :)
Исходник называется lib2.cpp, Объектный файл - lib2.o, скомпилированная либа - liblib2.so (вот тут первый lib - это префикс, второй - назввание).


FlySnake писал(а):
24.08.2014 09:33
В Вашем случае попробуйте собирать бинарник так: g++ -Wall -o main -L"." -l2 main.cpp


/usr/bin/ld: cannot find -l2
collect2: error: ld returned 1 exit status
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21360
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Создание и использование разделяемой библиотеки

Сообщение Bizdelnick »

DTF писал(а):
24.08.2014 12:41
/usr/bin/ld: cannot find -l2

Потому что не указан путь к библиотеке. -L lib2
Upd. Или она в том же каталоге лежит?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
DTF
Сообщения: 98

Re: Создание и использование разделяемой библиотеки

Сообщение DTF »

Bizdelnick писал(а):
24.08.2014 13:05
DTF писал(а):
24.08.2014 12:41
/usr/bin/ld: cannot find -l2

Потому что не указан путь к библиотеке. -L lib2


Указан.
-L"."

liblib2.so лежит в том же каталоге, откуда запускается команда сборки бинарника
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21360
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Создание и использование разделяемой библиотеки

Сообщение Bizdelnick »

Попробовал воспроизвести - всё собралось.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
DTF
Сообщения: 98

Re: Создание и использование разделяемой библиотеки

Сообщение DTF »

Если сделать
~/src/test_dep$ nm -D liblib2.so | grep Func


То получим
0000000000000935 T _Z5Func2v


Не может быть такого, что линкер ищет номальное имя функции - Func2, а в библиотеке оно замангленое?

Попробовал воспроизвести - всё собралось.

Странно... а можете прислать ваши файлы и скрипт сборки (я, конечно, понимаю, что вы скопировали всё у меня, но блин не бывает же чудес)?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21360
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Создание и использование разделяемой библиотеки

Сообщение Bizdelnick »

DTF писал(а):
24.08.2014 14:32
можете прислать ваши файлы и скрипт сборки

Содержимое файлов скопировал из верхнего поста, команды из скрипта выполнял по одной.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
DTF
Сообщения: 98

Re: Создание и использование разделяемой библиотеки

Сообщение DTF »

Все-таки нагуглил решение пороблемц!
http://stackoverflow.com/questions/1490523...on-which-exists
Суть в том, что важен порядок аргументов для gcc.


Вот так неправильно:
g++ -Wall -o main -L"." -llib2 main.cpp


А нужно вот так:
g++ -Wall -o main -L"." main.cpp -llib2
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21360
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Создание и использование разделяемой библиотеки

Сообщение Bizdelnick »

Интересно, почему у меня сработал "неправильный" вариант...
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
DTF
Сообщения: 98

Re: Создание и использование разделяемой библиотеки

Сообщение DTF »

А тот, который сработал у меня, у вас работает?
Какая у вас система и версия g++?
Спасибо сказали:
Аватара пользователя
sabir
Сообщения: 66
ОС: OpenBSD

Re: Создание и использование разделяемой библиотеки

Сообщение sabir »

Не знаю как это будет в цэпэпэ, но если Вам интересно, то вот рабочий пример на голом цэ:
lib2.h

Код: Выделить всё

#include <stdio.h>
void Func2();

lib2.c

Код: Выделить всё

#include "lib2.h"

void Func2()
{
    printf("Func2\n");
}

main.c

Код: Выделить всё

#include "lib2.h"

int main()
{
    Func2();
    return 0;
}

Сохранить следующий скрипт как, например, build.sh

Код: Выделить всё

#!/bin/sh
gcc -c -Wall -fpic lib2.c
gcc -shared -o lib2.so lib2.o
gcc -Wall -l2 -o main main.c
rm -rf *.o
./main

Выполнить команду:
# chmod +x build.sh
Компилим:
$ sh build.sh
Результат:
$ Func2
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Создание и использование разделяемой библиотеки

Сообщение drBatty »

sabir писал(а):
25.08.2014 12:51
Не знаю как это будет в цэпэпэ,

так же.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: