2011-11-17 65 views
4

我有一个f2.cpp文件编译共享对象库,调用函数从这样太

// f2.cpp 
#include <iostream> 

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

我用的crosstool编译器GCC cygwin的。

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

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

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

2

你可以简单地将它们关联起来(如果f2被编译成libf2.so,传递-lf2给连接器)。连接器将负责连接从f1f2的呼叫。当然,在运行时f1预计会在SO加载路径中找到f2,动态加载程序将加载它。

下面是一个更完整的示例,取自我发现的一个Makefile的一部分。在这里,mylib代表你f2main_linkedf1

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.来说说在哪里可以找到它(在这种情况下 - 当前目录)
1

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