是哟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文件所有文件都放在各自的项目目录下互不干扰