当前位置: 首页 > news >正文

生成 .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_Hextern"C"{intadd(inta,intb);intsubtract(inta,intb);intmultiply(inta,intb);floatdivide(inta,intb);}#endif

src/calculator.cpp

#include"calculator.h"intadd(inta,intb){returna+b;}intsubtract(inta,intb){returna-b;}intmultiply(inta,intb){returna*b;}floatdivide(inta,intb){if(b==0)return0;return(float)a/b;}

CMakeLists.txt

cmake_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_Hextern"C"{intadd(inta,intb);intsubtract(inta,intb);intmultiply(inta,intb);floatdivide(inta,intb);}#endif

src/main.cpp

#include<iostream>#include"calculator.h"intmain(){inta=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;return0;}

CMakeLists.txt

cmake_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的文件cat>maker_so/include/calculator.h<<'EOF' #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 EOFcat>maker_so/src/calculator.cpp<<'EOF' #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; } EOFcat>maker_so/CMakeLists.txt<<'EOF' 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的文件cat>user_so/src/main.cpp<<'EOF' #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; } EOFcat>user_so/CMakeLists.txt<<'EOF' 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/

手动构建步骤(如果没有脚本)

构建项目1

cdmaker_somkdirbuild&&cdbuild cmake..makecd../..

复制文件到项目2

mkdir-puser_so/lib user_so/includecpmaker_so/lib/libcalculator.so user_so/lib/cpmaker_so/include/calculator.h user_so/include/

构建项目2

cduser_somkdirbuild&&cdbuild 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. 项目1生成了libcalculator.so
  2. 项目2使用了这个.so文件
  3. 所有文件都放在各自的项目目录下,互不干扰
http://www.jsqmd.com/news/463586/

相关文章:

  • StableSR图像放大终极教程:从入门到精通的高清修复指南
  • Release It! 自动化版本管理和发布工具终极指南
  • 终极跨平台影音中心搭建指南:ZyPlayer高效使用手册
  • 智能简历投递:终极求职自动化解决方案
  • 终极指南:如何用PartCrafter实现AI驱动的单照片3D建模技术,从拍照到三维模型的革命性转变
  • libpag:跨平台动画渲染的革命性突破
  • 告别广告烦恼:SmartTube打造Android TV无广告观影终极体验
  • 7个Ghidra性能突破:让大型二进制文件分析速度提升300%的终极指南
  • 终极API模拟神器Mockoon:5个步骤让前端开发效率提升300%
  • PakePlus:9分钟将网页转为跨平台应用的终极指南
  • ScanTailor Advanced:专业级扫描文档优化神器,让模糊变清晰只需一键
  • 如何高效使用Unity.Mathematics:打造高性能游戏数学计算的终极指南
  • Windows字体安装革命:告别繁琐的一键解决方案
  • 如何让PDF色彩显示与打印一致?Stirling-PDF的终极色彩管理指南
  • 5个PDF字体优化技巧:从字符渲染到性能调优的完整指南
  • ffsubsync:自动字幕同步的终极解决方案
  • 7个实用技巧快速掌握React 360:从零构建惊艳VR交互体验
  • 3步搞定C++测试:Catch2 CMake零配置集成全攻略
  • Obsidian美化终极指南:从默认界面到个性化工作台的完整教程
  • Method Draw终极指南:简单上手的免费SVG编辑器完整教程
  • 终极AI工程系统架构实战指南:从理论到落地的完整解决方案
  • 解锁数字雕塑艺术:SculptGL免费3D雕刻工具创意指南
  • 5分钟搞定MineContext Docker部署:从零到一的完整指南
  • MouseInc.Settings:重新定义你的鼠标操作效率
  • 如何解决AtlasOS软件安装故障:从权限修复到系统优化的完整指南
  • 为什么PINNpapers是科学计算的终极资源库?探索物理知情神经网络的必备指南
  • 终极指南:LMMS开源音乐制作软件从社区驱动到专业工具的完整发展历程
  • 终极视频稳定指南:免费陀螺仪工具Gyroflow实战教程
  • Diffy:Ruby差异比较神器快速上手指南
  • Resilience4j熔断监控终极指南:从零搭建微服务健康看板