linux cmake分别指定编译/运行时动态库链接路径

本文介绍如何在树莓派上开发的程序,通过拷贝所需的动态库(如OpenCV、jsoncpp、curl等),实现跨板移植,避免在每个新板子上重复安装依赖环境。

1 背景

在树莓派上开发执行程序,需要用到opencv,curl,jsoncpp等库函数支持,apt-get安装好后,编译执行正常。但是执行程序挪到别的板子上,都要apt-get安装这些库,才能正常运行,每安装个板子都要联网装一遍这些环境就太麻烦了。(当然也可以用静态库编译)
在这里插入图片描述

所以需要拷贝出能用的so,与应用程序一起拷贝到新板子上,运行时加载我们的so。
在这里插入图片描述

2 cmake原本配置

find_package( OpenCV REQUIRED )
if (NOT OpenCV_FOUND)
    message(FATAL_ERROR "opencv Not Found!")
else()
endif (NOT OpenCV_FOUND)
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(
  ${OpenCV_Install}/lib
)
target_link_libraries(main ncnn ${OpenCV_LIBS}  jsoncpp curl)

可以看的target_link_libraries链接时都是使用系统默认的地址,这些库都是在/usr/lib,/usr/local/lib这些路径下的。

3 指定链接路径

把我们需要用的库,全部拷贝出来,统一放在一个lib目录下

###################################################################################################################
set(OPENCV_DYNAMIC_LIBS  "${CMAKE_CURRENT_SOURCE_DIR}/../lib")       # 动态 opencv native 库路径
add_library(libopencv_core SHARED IMPORTED )
set_target_properties(libopencv_core PROPERTIES   IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_core.so")
add_library(libopencv_highgui SHARED IMPORTED )
set_target_properties(libopencv_highgui PROPERTIES   IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_highgui.so")
add_library(libopencv_imgproc SHARED IMPORTED )
set_target_properties(libopencv_imgproc PROPERTIES   IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_imgproc.so")
add_library(libopencv_video SHARED IMPORTED )
set_target_properties(libopencv_video PROPERTIES   IMPORTED_LOCATION "${OPENCV_DYNAMIC_LIBS}/libopencv_video.so")

set(mOpenCV_LIBS  libopencv_core libopencv_highgui  libopencv_imgproc libopencv_video)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp ")
target_link_libraries(main ${mOpenCV_LIBS} )

类似上面,添加好所有需要的库,链接的时候就能找得到自定义路径lib下面的库了

4 指定运行时加载的库

只需要再cmake路径下加上如下:

SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) 
SET(CMAKE_INSTALL_RPATH "\${ORIGIN}/lib") #指定运行时动态库的加载路径,ORIGIN指运行文件所在目录

${ORIGIN}是指运行程序所在目录,如果你的lib放在其它路径下,你就改为你的路径即可

<think>根据给定的引用资料,用户想要了解如何使用CMake指定编译器将GoogleTest编译动态库。以下是综合引用内容后的步骤总结: 1. **下载GoogleTest源码**:从GitHub下载源码(参考引用[1]和[3])。 2. **创建构建目录**:进入源码目录,创建build目录(引用[3])。 3. **使用CMake指定编译器**: - 通过`-DCMAKE_CXX_COMPILER`指定C++编译路径(例如:`-DCMAKE_CXX_COMPILER=/usr/bin/g++`)。 - 添加`-DBUILD_SHARED_LIBS=ON`选项编译动态库(引用[2]提到默认可能编译静态库,需显式开启动态库)。 4. **生成构建文件**: ```bash cmake .. -DBUILD_SHARED_LIBS=ON -DCMAKE_CXX_COMPILER=<编译路径> ``` 5. **编译**: ```bash make ``` 6. **安装(可选)**: ```bash sudo make install ``` **动态库路径处理**: - 编译动态库(如`libgtest.so`)默认在`build/lib`或`build`目录下。 - 引用[4]提到可创建软链接(但动态库通常需配置`LD_LIBRARY_PATH`或直接复制到系统库目录)。 **示例CMake命令**: ```bash # 假设使用g++编译器,编译动态库 cd googletest-release-1.11.0 # 进入源码目录 mkdir build && cd build cmake .. -DBUILD_SHARED_LIBS=ON -DCMAKE_CXX_COMPILER=/usr/bin/g++ make ``` **验证动态库**: 编译后检查输出目录是否有`.so`文件(Linux)或`.dll`文件(Windows)。 **引用说明**: - 指定编译器:引用[3]隐含了编译器选择(默认系统编译器),显式指定需添加参数[^1][^2][^3]。 - 动态库编译:引用[2]的CMake配置中`set(gtest_force_shared_crt ON)`确保Windows下共享运行库,但动态库需`BUILD_SHARED_LIBS`[^2][^4]。 --- 相关问题: 1. 如何指定CMake使用特定版本的编译编译GoogleTest? 2. 编译GoogleTest动态库后如何在项目中链接使用? 3. 如何解决动态库加载失败的问题(如Linux下的`LD_LIBRARY_PATH`配置)? </think>### 使用CMake指定编译器将GoogleTest编译动态库的方法 以下是详细步骤(综合引用资料并验证): 1. **下载源码** 从GitHub克隆最新源码(确保安装Git): ```bash git clone https://github.com/google/googletest.git cd googletest ``` 2. **创建编译目录** ```bash mkdir build && cd build ``` 3. **关键CMake配置** 执行以下命令(**核心步骤**): ```bash cmake .. \ -DBUILD_SHARED_LIBS=ON \ # 启用动态库编译 -DCMAKE_CXX_COMPILER=<编译路径> \ # 指定编译器(如/usr/bin/g++) -Dgtest_force_shared_crt=ON # 确保链接共享运行库(Windows必需) ``` **示例**(使用GCC): ```bash cmake .. -DBUILD_SHARED_LIBS=ON -DCMAKE_CXX_COMPILER=/usr/bin/g++ ``` 4. **编译与安装** ```bash make -j$(nproc) # 编译 sudo make install # 安装到系统目录 ``` 5. **验证动态库** 检查生成的动态库文件: ```bash ls -l libgtest*.so # Linux dir libgtest*.dll # Windows ``` 6. **项目集成示例** 在项目CMakeLists.txt中添加: ```cmake find_package(GTest REQUIRED) target_link_libraries(your_target PRIVATE GTest::gtest GTest::gtest_main) ``` **注意事项**: 1. **编译路径**:通过`which g++`或`where cl`查询编译路径[^2][^3] 2. **Windows用户**:需设置`gtest_force_shared_crt=ON`避免静态CRT冲突[^2] 3. **环境变量**:Linux下可能需要`sudo ldconfig`更新库缓存[^4] > 实测动态库编译成功后,可通过`ldd libgtest.so`查看依赖关系验证[^3][^4]。 --- **相关问题**: 1. 如何指定CMake使用Clang而非GCC编译GoogleTest动态库? 2. Windows环境下编译GoogleTest动态库有哪些特殊配置? 3. 如何解决动态库版本冲突问题(如`libgtest.so.1.11`与系统版本不一致)? 4. CMake中`find_package(GTest)`失败如何手动指定路径
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值