在共享库中使用共享库

时间:2015-07-11 15:09:28

标签: c++ shared-libraries

我想在共享库中使用共享库,但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的正确方法是什么?

2 个答案:

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