ubuntu链接动态库的问题

动态库

在Linux动态库管理中,各组件的作用如下:

  1. 文件命名规则
libfoo.so.0.0.1  # 真实库文件(主版本.次版本.修订版本)
libfoo.so.0      # 主版本符号链接(对应soname)
libfoo.so        # 开发符号链接(编译链接时使用)
  1. 版本号意义
  • 主版本号:不兼容的API修改(当发生重大API变更时递增)
  • 次版本号:新增功能但保持向下兼容(当添加新功能但保持兼容时递增)
  • 修订版本:bug修复/性能优化(当进行向后兼容的改进时递增)
  1. 编译选项解析
-Wl,-rpath=/path/to/lib   # 将运行时库路径硬编码到可执行文件中
-L/path/to/lib            # 指定编译时的库搜索路径
-lfoo                     # 链接libfoo.so(实际查找的是libfoo.so的符号链接)
  1. 完整示例流程
# 1. 创建实际库文件
sudo cp libfoo.so.0.0.1 /usr/local/lib/

# 2. 创建版本符号链接
sudo ln -s /usr/local/lib/libfoo.so.0.0.1 /usr/local/lib/libfoo.so.0
sudo ln -s /usr/local/lib/libfoo.so.0 /usr/local/lib/libfoo.so

# 3. 更新动态链接器缓存
sudo ldconfig

# 4. 带rpath的编译命令
gcc main.c -Wl,-rpath=/usr/local/lib -L/usr/local/lib -lfoo -o app

# 5. 查看依赖关系
ldd app | grep libfoo
  1. 运行时路径优先级(从高到低):

  2. LD_LIBRARY_PATH 环境变量指定的路径

  3. -rpath 硬编码在可执行文件中的路径

  4. /etc/ld.so.conf 中配置的系统路径

  5. 默认系统路径(/lib, /usr/lib)

  6. 多版本管理技巧

# 同时保留两个版本
/usr/local/lib/
├── libfoo.so.0.0.1
├── libfoo.so.0 -> libfoo.so.0.0.1
├── l
Ubuntu系统中创建动态链接可按以下方法操作: ### 使用gcc创建 使用gcc创建动态库时,其文件命名规范是以lib作为前缀,后缀为.so文件,命令格式如下: ```bash gcc -shared -fPIC -o lib<name>.so <source_files> ``` 其中,`-shared` 表示指定生成动态链接,不可省略;`-fPIC` 表示编译为位置独立的代码,不可省略;`-o` 同样不可省略。例如,要创建一个名为 `libhelloworld.so` 的动态库: ```bash gcc -shared -fPIC -o libhelloworld.so helloworld.c ``` ### 使用CMake创建 若使用CMake创建动态链接,可通过编写 `CMakeList.txt` 文件实现,示例内容如下: ```cmake cmake_minimum_required(VERSION 3.0) project(demo CXX) # 设置编译为Release模式 set(CMAKE_BUILD_TYPE "Release") # 添加opencv的头文件地址 find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) # 添加show_img内头文件的地址,如果目录结构有变化,修改“.”的内容 aux_source_directory(. DIR_SRC) message(STATUS "SRC: ${DIR_SRC}") # 添加opencv地址 add_library(showimg SHARED ${DIR_SRC}) # 连接opencv target_link_libraries(showimg ${OpenCV_LIBS}) # 设置编译得到的so文件的保存目录为【${PROJECT_SOURCE_DIR}】 set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR}) # 设置so文件的名字为【showimg】,生成的so文件名字为【libshowimg】 # 并设置文件在保存目录下的保存文件夹为【lib】,该文件夹会自动被创立 install(TARGETS showimg LIBRARY DESTINATION lib) ``` 编写好 `CMakeList.txt` 后,在终端中执行以下命令: ```bash mkdir build cd build cmake .. make ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值