生成 .so 和使用 .so
是哟ing两个最简单的项目演示使用 c 项目生成 .so 和在 c 项目中使用 .so项目1生成 .so 文件 (maker_so)项目结构maker_so/ ├── include/ │ └── calculator.h ├── src/ │ └── calculator.cpp └── CMakeLists.txt文件内容include/calculator.h#ifndefCALCULATOR_H#defineCALCULATOR_HexternC{intadd(inta,intb);intsubtract(inta,intb);intmultiply(inta,intb);floatdivide(inta,intb);}#endifsrc/calculator.cpp#includecalculator.hintadd(inta,intb){returnab;}intsubtract(inta,intb){returna-b;}intmultiply(inta,intb){returna*b;}floatdivide(inta,intb){if(b0)return0;return(float)a/b;}CMakeLists.txtcmake_minimum_required(VERSION 3.10) project(maker_so) # 设置库的输出目录为项目下的 lib set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) # 包含头文件目录 include_directories(${CMAKE_SOURCE_DIR}/include) # 创建动态库 add_library(calculator SHARED src/calculator.cpp) message(STATUS Building calculator shared library)构建项目1# 创建并进入项目目录mkdir-pmaker_so/{include,src,build}cdmaker_so# 创建文件使用上面的内容# ... 创建 calculator.h, calculator.cpp, CMakeLists.txt# 构建cdbuild cmake..cmake--build.# 查看生成的 .sols-l../lib/# 应该看到: libcalculator.so项目2使用 .so 文件 (user_so)项目结构user_so/ ├── lib/ # 从项目1复制过来的 .so │ └── libcalculator.so ├── include/ # 从项目1复制过来的头文件 │ └── calculator.h ├── src/ │ └── main.cpp └── CMakeLists.txt文件内容include/calculator.h从项目1复制#ifndefCALCULATOR_H#defineCALCULATOR_HexternC{intadd(inta,intb);intsubtract(inta,intb);intmultiply(inta,intb);floatdivide(inta,intb);}#endifsrc/main.cpp#includeiostream#includecalculator.hintmain(){inta15,b4;std::cout Using calculator library \n;std::couta b add(a,b)std::endl;std::couta - b subtract(a,b)std::endl;std::couta * b multiply(a,b)std::endl;std::couta / b divide(a,b)std::endl;return0;}CMakeLists.txtcmake_minimum_required(VERSION 3.10) project(user_so) # 设置可执行文件输出目录 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) # 设置 RPATH让程序能在 lib 目录找到 .so set(CMAKE_INSTALL_RPATH ${CMAKE_SOURCE_DIR}/lib) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) # 包含头文件目录 include_directories(${CMAKE_SOURCE_DIR}/include) # 指定库文件目录 link_directories(${CMAKE_SOURCE_DIR}/lib) # 创建可执行文件 add_executable(calc_app src/main.cpp) # 链接动态库 target_link_libraries(calc_app calculator) message(STATUS Building application that uses calculator.so)完整的一键构建脚本创建一个脚本build_all.sh来自动化整个过程#!/bin/bashecho 项目1: 生成 libcalculator.so # 创建项目1mkdir-pmaker_so/{include,src,build}# 创建项目1的文件catmaker_so/include/calculator.hEOF #ifndef CALCULATOR_H #define CALCULATOR_H extern C { int add(int a, int b); int subtract(int a, int b); int multiply(int a, int b); float divide(int a, int b); } #endif EOFcatmaker_so/src/calculator.cppEOF #include calculator.h int add(int a, int b) { return a b; } int subtract(int a, int b) { return a - b; } int multiply(int a, int b) { return a * b; } float divide(int a, int b) { if (b 0) return 0; return (float)a / b; } EOFcatmaker_so/CMakeLists.txtEOF cmake_minimum_required(VERSION 3.10) project(maker_so) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib) include_directories(${CMAKE_SOURCE_DIR}/include) add_library(calculator SHARED src/calculator.cpp) EOF# 构建项目1cdmaker_somkdir-pbuildcdbuild cmake..cmake--build.cd../..echo-e\n 项目2: 使用 libcalculator.so # 创建项目2mkdir-puser_so/{include,src,build,lib}# 从项目1复制 .so 和头文件到项目2cpmaker_so/lib/libcalculator.so user_so/lib/cpmaker_so/include/calculator.h user_so/include/# 创建项目2的文件catuser_so/src/main.cppEOF #include iostream #include calculator.h int main() { int a 15, b 4; std::cout Using calculator library \n; std::cout a b add(a, b) std::endl; std::cout a - b subtract(a, b) std::endl; std::cout a * b multiply(a, b) std::endl; std::cout a / b divide(a, b) std::endl; return 0; } EOFcatuser_so/CMakeLists.txtEOF cmake_minimum_required(VERSION 3.10) project(user_so) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin) set(CMAKE_INSTALL_RPATH ${CMAKE_SOURCE_DIR}/lib) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) include_directories(${CMAKE_SOURCE_DIR}/include) link_directories(${CMAKE_SOURCE_DIR}/lib) add_executable(calc_app src/main.cpp) target_link_libraries(calc_app calculator) EOF# 构建项目2cduser_somkdir-pbuildcdbuild cmake..cmake--build.cd../..echo-e\n 运行结果 ./user_so/bin/calc_appecho-e\n 项目文件列表 echo项目1生成的 .so:ls-lmaker_so/lib/echo-e\n项目2使用的 .so:ls-luser_so/lib/echo-e\n项目2生成的可执行文件:ls-luser_so/bin/手动构建步骤如果没有脚本构建项目1cdmaker_somkdirbuildcdbuild cmake..makecd../..复制文件到项目2mkdir-puser_so/lib user_so/includecpmaker_so/lib/libcalculator.so user_so/lib/cpmaker_so/include/calculator.h user_so/include/构建项目2cduser_somkdirbuildcdbuild cmake..makecd../..运行./user_so/bin/calc_app验证 .so 文件# 查看 .so 的符号nm-Duser_so/lib/libcalculator.so# 查看可执行文件的依赖ldd user_so/bin/calc_app# 运行程序./user_so/bin/calc_app这样就完成了项目1生成了libcalculator.so项目2使用了这个.so文件所有文件都放在各自的项目目录下互不干扰

相关新闻

VideoCaptioner终极指南:零基础快速制作AI字幕的简单高效方法

VideoCaptioner终极指南:零基础快速制作AI字幕的简单高效方法

VideoCaptioner终极指南:零基础快速制作AI字幕的简单高效方法 【免费下载链接】VideoCaptioner 🎬 卡卡字幕助手 | VideoCaptioner - 基于 LLM 的智能字幕助手,无需GPU一键高质量字幕视频合成!视频字幕生成、断句、校正、字幕翻译…

2026/5/17 12:23:55 阅读更多 →
重新定义pwndbg调试器:从零掌握高效逆向工程

重新定义pwndbg调试器:从零掌握高效逆向工程

重新定义pwndbg调试器:从零掌握高效逆向工程 【免费下载链接】pwndbg Exploit Development and Reverse Engineering with GDB Made Easy 项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg pwndbg是一款专为漏洞利用开发和逆向工程设计的GDB插件&am…

2026/5/17 2:29:21 阅读更多 →
终极PDF目录自动化生成全攻略:3步打造专业文档结构

终极PDF目录自动化生成全攻略:3步打造专业文档结构

终极PDF目录自动化生成全攻略:3步打造专业文档结构 【免费下载链接】pdf.tocgen 项目地址: https://gitcode.com/gh_mirrors/pd/pdf.tocgen pdf.tocgen是一套强大的命令行工具集,能够自动提取和生成PDF文件的目录结构。它通过分析PDF中嵌入的字体…

2026/7/3 2:24:32 阅读更多 →

最新新闻

机器学习生产化:从模型部署到可运维工程系统的实战指南

机器学习生产化:从模型部署到可运维工程系统的实战指南

1. 为什么“模型上线”不是终点,而是系统性风险的起点?你有没有经历过这样的场景:凌晨两点,手机突然震动,钉钉消息一条接一条弹出来——“风控决策延迟超时”“用户申请失败率飙升至32%”“实时反欺诈服务响应时间突破…

2026/7/3 7:34:02 阅读更多 →
仅限首批读者:ChatGPT CoT黄金提示库V2.1(含17个经A/B测试验证的思维链变体,失效率<1.2%)

仅限首批读者:ChatGPT CoT黄金提示库V2.1(含17个经A/B测试验证的思维链变体,失效率<1.2%)

更多请点击: https://codechina.net 第一章:ChatGPT思维链(CoT)的核心原理与演进脉络 思维链(Chain-of-Thought, CoT)并非ChatGPT原生内置的模块化功能,而是通过提示工程激发大语言模型显式生成…

2026/7/3 7:32:01 阅读更多 →
从零到CI/CD内嵌:ChatGPT生成单元测试,7步落地法,含可直接运行的Prompt工程+边界值校验脚本

从零到CI/CD内嵌:ChatGPT生成单元测试,7步落地法,含可直接运行的Prompt工程+边界值校验脚本

更多请点击: https://kaifayun.com 第一章:ChatGPT 生成 单元测试 代码 大型语言模型如 ChatGPT 已成为开发者编写单元测试的高效辅助工具,尤其适用于快速生成覆盖边界条件、异常路径和典型业务逻辑的测试用例。其优势在于理解自然语言描述的…

2026/7/3 7:30:00 阅读更多 →
3分钟上手:LyricsX让Mac桌面歌词显示变得如此简单

3分钟上手:LyricsX让Mac桌面歌词显示变得如此简单

3分钟上手:LyricsX让Mac桌面歌词显示变得如此简单 【免费下载链接】Lyrics Swift-based iTunes plug-in to display lyrics on the desktop. 项目地址: https://gitcode.com/gh_mirrors/lyr/Lyrics 还在为iTunes没有歌词显示功能而烦恼吗?LyricsX…

2026/7/3 7:27:59 阅读更多 →
GPT-SoVITS终极优化指南:如何在Mac上实现300%语音合成性能提升

GPT-SoVITS终极优化指南:如何在Mac上实现300%语音合成性能提升

GPT-SoVITS终极优化指南:如何在Mac上实现300%语音合成性能提升 【免费下载链接】GPT-SoVITS 1 min voice data can also be used to train a good TTS model! (few shot voice cloning) 项目地址: https://gitcode.com/GitHub_Trending/gp/GPT-SoVITS 你是否…

2026/7/3 7:25:59 阅读更多 →
江苏mom软件厂商推荐-江苏汉软

江苏mom软件厂商推荐-江苏汉软

江苏省,作为中国制造业的重镇,汇聚了众多为工厂数字化转型提供“大脑”的MOM(制造运营管理)软件厂商。江苏汉软工业智能技术有限公司(简称“江苏汉软”)是其中颇具代表性的一家,此外&#xff0c…

2026/7/3 7:25:59 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻