在共享库中使用共享库
Using shared library within shared library
本文关键字:共享 更新时间:2023-10-16
我想在共享库中使用共享库,但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的正确方法是什么吗?
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
不在同一目录中,则需要告诉编译器如何查找标头,例如在编译main.cpp
时使用-IextB
文件main.cpp
包含标头b.h
,并使用libB.so
中定义的函数g()
,那么为什么要编译main.cpp
,告诉它如何查找a.h
并链接到libA.so
?它不需要那个标头或那个库!
您可能只想将A
更改为B
,因为main.cpp
实际上依赖于此:
g++ -IextB main.cpp -LextB -lB -o main
我找到了解决方案。编译libB.so的正确方法是:
g++ -c -fpic -I../extA b.cpp
g++ -shared -o libB.so b.o -L../extA -lA
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 无法在Ubuntu上将共享库与Eclipse链接
- 从python调用openMP共享库时,未定义opnMP函数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 为什么我的共享库中存在展开符号
- 使用共享指针的函数调用,其对象应为 const
- 具有两个独占锁组的共享锁
- 共享队列的线程安全
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 多个"常量引用"变量可以共享同一个内存吗?
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针