我想在共享库中使用共享库,但g ++抱怨......
这就是我的测试样本的样子:
.
├── extA
│ ├── a.cpp
│ ├── a.h
│ └── libA.so
├── extB
│ ├── b.cpp
│ ├── b.h
│ └── libB.so
└── main.cpp
A.H:
#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 ++ - 调用会导致错误消息:
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的正确方法是什么?
答案 0 :(得分: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
告诉它如何查找{ {1}}并链接到a.h
?它不需要那个标题或那个库!
您可能只想将libA.so
更改为A
,因为这是B
实际依赖的内容:
main.cpp
答案 1 :(得分:0)
我找到了解决方案。 编译libB.so的正确方法是:
g++ -c -fpic -I../extA b.cpp
g++ -shared -o libB.so b.o -L../extA -lA