2015-07-11 4 views
0

Я хочу использовать общую библиотеку в общей библиотеке, но г ++ жалуется ...Использование разделяемой библиотеки в общей библиотеке

Вот как мой тестовый образец выглядит:

.                                  
├── extA                                 
│   ├── a.cpp                               
│   ├── a.h                                
│   └── libA.so                               
├── extB                                 
│   ├── b.cpp                               
│   ├── b.h                                
│   └── libB.so                               
└── main.cpp 

ах:

#pragma once 

int f(void); 

a.cpp:

#include "a.h" 

int f(void) { 
     return 42; 
} 

b.h:

#pragma once 

#include "a.h" 

int g(void); 

b.cpp:

#include "b.h" 

int g(void) { 
     return f(); 
} 

main.cpp:

#include <cstdlib> 
#include <iostream> 

#include "b.h" 


int main(int, char **) { 
     std::cout << g() << std::endl; 

     return EXIT_SUCCESS; 
} 

Я уверен, что мой способ компиляции неправильно. Это то, что я делаю:

g++ -c -fpic a.cpp 
g++ -shared -o libA.so a.o 

создать libA.so,

g++ -c -fpic -I../extA b.cpp -L../extA -lA 
g++ -shared -o libB.so b.o 

создать libB.so (я думаю, что этот путь является неправильным), и, наконец:

g++ -IexB main.cpp -LextB -lB -o main 

В последний g ++ - вызов приводит к ошибке. msg:

In file included from main.cpp:4:0: 
extB/b.h:3:15: fatal error: a.h: No such file or directory 
#include "a.h" 
      ^
compilation terminated. 

Может ли кто-нибудь сказать мне, что это правильный способ скомпилировать/создать libB.so?

ответ

1
main.cpp:4:15: fatal error: b.h: No such file or directory 
#include "b.h" 
      ^

ошибка не имеет ничего общего с libB.so это означает main.cpp не может найти b.h, что является проблемой найти заголовки, ничего общего с общим файлом библиотеки.

Если b.h не находится в том же каталоге, что и main.cpp, тогда вам нужно сообщить компилятору, как найти заголовок, например. с помощью -IextB при компиляции main.cpp

Файл main.cpp включает заголовок b.h и использует функцию, определенную в g()libB.so так почему вы компилируете main.cpp говорить ему, как найти a.h и ссылки на libA.so? Ему не нужен этот заголовок или эта библиотека!

Вы, вероятно, просто хотите изменить A к B, так это то, что на самом деле main.cpp зависит от:

g++ -IextB main.cpp -LextB -lB -o main 
0

Я нашел решение. Правильный способ компиляции libB.so:

g++ -c -fpic -I../extA b.cpp 
g++ -shared -o libB.so b.o -L../extA -lA 
Смежные вопросы