天天看點

Linux上制作可執行的共享庫示例

<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 &lt;stdio.h&gt;

#include &lt;stdlib.h&gt;

// 使用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,如需轉載請自行聯系原作者

繼續閱讀