编译共享对象库,也从中调用函数

时间:2011-11-17 12:57:16

标签: c++ g++ shared-libraries

我有一个f2.cpp文件

// f2.cpp
#include <iostream>

void f2()
{
    std::cout << "It's a call of f2 function" << std::endl;
}

我使用cygwin和crosstool编译器gcc。

g++ -fPIC -c f2.cpp
g++ -shared -o libf2.so f2.o

我有一个libf2.so文件。现在我想调用f1库中的f2函数(共享对象)libf1.so。

这是一个f1.cpp,我想拿f1.so

// f1.cpp
#include <iostream>
void f1()
{
    std::cout << "f1 function is calling f2()..." << std::endl;
    f2();
}

我如何编译f1.cpp?我不想使用dlclose,dlerror,dlopen,dlsym ...... 最后我想在main.cpp中使用f1.so作为共享对象库...不使用使用dlclose,dlerror,dlopen,dlsym。我将如何编译main.cpp,当我有一个f1.so?

// main.cpp
#include <iostream>
int main()
{
    f1();
    return 0;
}

3 个答案:

答案 0 :(得分:3)

在头文件中声明f2()。并编译libf1.so类似于libf2。

现在编译针对f1和f2的主链接。 看起来应该是这样的 g++ -lf2 -lf1 -L /path/to/libs main.o

答案 1 :(得分:2)

您可以简单地将它们链接在一起(如果将f2编译为libf2.so,则将-lf2传递给链接器。链接器将负责将f1f2的呼叫连接起来。当然,在运行时 f1期望在SO加载路径中找到f2,动态加载器将加载它。

这是一个更完整的样本,取自我发现的Makefile的一部分。在此处,mylib代表您的f2main_linked代表f1

mylib: mylib.c mylib.h
    gcc $(CFLAGS) -fpic -c mylib.c
    gcc -shared -o libmylib.so mylib.o

main_linked: main_linked.c mylib.h mylib.c
    gcc $(CFLAGS) -L. -lmylib main_linked.c -o main_linked

注意:

  1. mylib已编译为包含-shared
  2. 的共享库
  3. main_linked然后通过gcc调用-lmylib来指定要链接的库,-L.说明在哪里找到它(在这种情况下 - 当前DIR)

答案 2 :(得分:1)

检查-L和-l标志到g ++。