kompilowanie biblioteki z dołączeniem innej

0

Witam

Problem mam sfomułowany następująco:
Pliki:

  1. a.cpp, a.h, atest.cpp
  2. b.cpp, b.h
  • plik a.cpp kompiluję do biblioteki liba.so
  • plik b.cpp kompiluję do biblioteki libb.so
  • funkcja af01 zdefiniowana w a.cpp korzysta z funkcji bf01 zdefiniowanej w b.cpp
  • atest.cpp kompiluję do programu wykonywalnego, który odwołuje się do af01 a więc pośrednio do bf01

No i kompilator komunikuje o błędzie przy kompilacji atest.cpp:
mormegil@devel-1:/vol/cuma/sandbox$ g++ -Wall -L/vol/cuma/sandbox atest.cpp -la -o atest
/vol/cuma/sandbox/liba.so: undefined reference to `bf01(int)'

Jak poprawnie zbudować bibliotekę liba.so ?

Jak dotąd robiłem to tak:

mormegil@devel-1:/vol/cuma/sandbox$ g++ -Wall -fPIC -c a.cpp
mormegil@devel-1:/vol/cuma/sandbox$ g++ -shared -W1,-soname,liba.so.1 -o liba.so.1.0 a.o -L/vol/cuma/sandbox/ -lb
mormegil@devel-1:/vol/cuma/sandbox$ ln -sf /vol/cuma/sandbox/liba.so.1.0 /vol/cuma/sandbox/liba.so
mormegil@devel-1:/vol/cuma/sandbox$ ln -sf /vol/cuma/sandbox/liba.so.1.0 /vol/cuma/sandbox/liba.so.1
no i :
mormegil@devel-1:/vol/cuma/sandbox$ g++ -Wall -L/vol/cuma/sandbox atest.cpp -la -o atest

Jeżeli funkcja af01 nie odwołuje się do funkcji w bibliotece libb.so, to atest.cpp kompiluje się i uruchamia bez problemu.

Pozdrawiam

Cuma

0

Wystarczy kompilować tak g++ -Wall -L/vol/cuma/sandbox atest.cpp -la -lb -o atest.

0

Problem rozwiązany, tkwił w źródłach. W plik nagłówkowym b.h w deklaracji funkcji bf01 je argumentem była zmienna typu unsigned int, w definicji był już int. Prawidłowy schemat kompilacji jest następujący:

Etap 1:
$ g++ -Wall -fPIC -c b.cpp
$ g++ -shared -Wl,-soname,libb.so.1 -o libb.so.1.0 b.o
$ ln -sf /vol/cuma/sandbox/libb.so.1.0 /vol/cuma/sandbox/libb.so
$ ln -sf /vol/cuma/sandbox/libb.so.1.0 /vol/cuma/sandbox/libb.so.1
Etap 2:
$ g++ -Wall -fPIC -c a.cpp
$ g++ -shared -Wl,-soname,liba.so.1 -L/vol/cuma/sandbox -lb -o liba.so.1.0 a.o
$ ln -sf /vol/cuma/sandbox/liba.so.1.0 /vol/cuma/sandbox/liba.so
$ ln -sf /vol/cuma/sandbox/liba.so.1.0 /vol/cuma/sandbox/liba.so.1
Etap 3:
$ g++ -Wall -L/vol/cuma/sandbox -la atest.cpp -o atest

Biblioteka libb.so musi być dołączona na etapie 2.2, jeśli dołączać ją na etapie 2.1
g++ -Wall -fPIC -L/vol/cuma/sandbox -lb -c a.cpp to kompilator generuje błąd:
error: ... liba.so: undefined reference to `bf01(unsigned int)'

Pozdrawiam

Cuma

1 użytkowników online, w tym zalogowanych: 0, gości: 1