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

Compile shared object library, which call function from so too

本文关键字:调用 函数 共享 对象 编译      更新时间:2023-10-16

我有一个f2.cpp文件

// f2.cpp
#include <iostream>
void f2()
{
    std::cout << "It's a call of f2 function" << std::endl;
}

我使用cygwin和交叉编译器gcc。

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

我有一个电梯。所以文件。现在我想调用f2函数在f1库(共享对象)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, dloopen, dlsym…Аt最后我想用f1。所以在main.cpp作为一个共享对象库也是…不使用使用dlclose, dlerror, dlopen, dlsym。我必须如何编译main.cpp,当我将有一个f1。

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

在头文件中声明f2()并编译libf1。和libf2很像

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

您可以简单地将它们链接在一起(如果f2被编译成libf2.so,则将-lf2传递给链接器)。链接器将负责连接从f1f2的调用。自然地,在运行时 f1将期望在SO加载路径中找到f2,并且动态加载器将加载它。

下面是一个更完整的示例,取自我发现的Makefile的一部分。这里,mylib代表您的f2, main_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. main_linked然后用单个gcc调用来构建,传递-lmylib来指定要链接的库,并传递-L.来说明在哪里可以找到它(在这种情况下-当前目录)

检查g++的-L和-L标志