C ++ Связывание одной библиотеки через другую - PullRequest
0 голосов
/ 04 февраля 2019

libA.so ссылается на libB.so

основные ссылки на libB.so, но не может получить доступ к символам libA.so.Зачем?Есть ли способ, которым я могу сделать символы libA.so видимыми для main через libB.so

cat a.cc 
#include<iostream>
void hello() {
   return;
}

cat  b.cc
#include <iostream>
void goodbye() {
  return;
}


cat c.cc m
#include<iostream>
void goodbye();
void hello();
void tc() {
  goodbye();
  hello();
}


cat main.cc
#include<iostream>
void hello();
void goodbye();
int main() {
   hello();
}

Не уверен, почему это не работает, как я могу заставить его работать?

g++ -fPIC -c a.cc b.cc 
g++ a.o b.o -shared -o libA.so


g++ -fPIC -c c.cc
g++ c.o -shared -lA -L. -o libB.so 

g++ main.cc -lA -L.
g++ main.cc -lB -L.
/tmp/cci2foLo.o: undefined reference to symbol '_Z5hellov'
./libA.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

ldd libB.so 
linux-vdso.so.1 =>  (0x00007fffa733d000)
libA.so => ./libA.so (0x00002b0f9a92a000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002b0f9ab5e000)
libm.so.6 => /lib64/libm.so.6 (0x00002b0f9ae64000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b0f9b0e8000)
libc.so.6 => /lib64/libc.so.6 (0x00002b0f9b2ff000)
/lib64/ld-linux-x86-64.so.2 (0x00002b0f9a504000)

Как мне связать главное с А через В?

1 Ответ

0 голосов
/ 04 февраля 2019

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

И они экспортируют только свои собственные символы, а не библиотекиссылки на.

Это означает, что main.cc может использовать функции, классы и символы в целом из библиотек, на которые он явно ссылается.Если вы хотите использовать символы из библиотеки A, вам нужно связаться с библиотекой A.

...