Linux上制作可执行的共享库示例
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函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义