在共享库中使用共享库

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.hmain.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