<a href="http://bbs.hadoopor.com/forum-36-1.html">http://bbs.hadoopor.com/forum-36-1.html</a>
x.cpp為共享庫libx.so的實作,b.cpp為可執行b的實作。
x.cpp檔案内容:
#include <stdio.h>
#include <stdlib.h>
// 使用C++作為編譯器
void woo()
{
printf("woo\n");
}
// foo作為共享庫的入口,必須為C函數
extern "C" foo()
printf("foo\n");
exit(0); // 請注意這裡必須調用,否則輸出foo後會有段錯誤
b.cpp檔案内容:
int main()
extern void woo();
extern "C" void foo();
woo();
foo();
return 0;
編譯x.cpp為可執行的共享庫:
g++ -g -o libx.so -fPIE -pie -nostartfiles -Wl,-e,foo-rdynamic x.cpp
-fPIE -pie是保證共享庫可以執行,其中-fPIE編譯參數,表示生成與位置無關的可執行代碼(-fPIC隻是生成與位置無關的非可執行代碼),-pid是連結參數;-Wl,-e,foo指定共享庫的入口函數,相當于可執行程式的main函數;如果沒有-nostartfiles,則連結時會報main函數未定義;-rdynamic也是必須的,否則編譯b.cpp時會報找不到foo定義;如需檢視詳細的編譯連結過程,加上-v參數。請注意不能包含<b>-shared</b>參數,否則運作共享庫時直接段錯誤。
編譯b.cpp為可執行檔案:
g++ -g -o b -L. -lx b.cpp
成功之後,libx.so和b都是可執行的了,其中libx.so的入口是foo,而b的入口是main函數。
本文轉自eyjian 51CTO部落格,原文連結:http://blog.51cto.com/mooon/579684,如需轉載請自行聯系原作者