我有一个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;
}
答案 0 :(得分:3)
在头文件中声明f2()。并编译libf1.so类似于libf2。
现在编译针对f1和f2的主链接。
看起来应该是这样的
g++ -lf2 -lf1 -L /path/to/libs main.o
答案 1 :(得分:2)
您可以简单地将它们链接在一起(如果将f2
编译为libf2.so
,则将-lf2
传递给链接器。链接器将负责将f1
到f2
的呼叫连接起来。当然,在运行时 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
注意:
mylib
已编译为包含-shared
main_linked
然后通过gcc
调用-lmylib
来指定要链接的库,-L.
说明在哪里找到它(在这种情况下 - 当前DIR)答案 2 :(得分:1)
检查-L和-l标志到g ++。