天天看点

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,如需转载请自行联系原作者

继续阅读