Linux上制作可执行的共享库示例

本文介绍如何使用C++创建共享库libx.so及其对应的可执行文件b。通过具体示例x.cpp和b.cpp展示了必要的编译步骤和参数,包括如何确保共享库能够正确地被调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

我还没来得及验证,先保留下来再说.
 
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参数。请注意不能包含-shared参数,否则运行共享库时直接段错误。

编译b.cpp为可执行文件:
g++ -g -o b -L. -lx  b.cpp

成功之后,libx.so和b都是可执行的了,其中libx.so的入口是foo,而b的入口是main函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值