2011-11-17 61 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 ++。