使用动态库的流程(ORBSLAM3实例):
- 在调用动态库或静态库的.cpp文件添加库的头文件(可以包含路径,也可以在cmakelist文件加头文件搜索路径)
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/../../../
${PROJECT_SOURCE_DIR}/../../../include
${PROJECT_SOURCE_DIR}/../../../include/CameraModels
${PROJECT_SOURCE_DIR}/../../../Thirdparty/Sophus
${Pangolin_INCLUDE_DIRS}
)
- cmakelist添加库文件路径
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM3.so
-lboost_system
)
- 链接库文件和项目
target_link_libraries(Mono
${LIBS}
)
# Node for monocular camera (Augmented Reality Demo)
rosbuild_add_executable(MonoAR
src/AR/ros_mono_ar.cc
src/AR/ViewerAR.h
src/AR/ViewerAR.cc
)
简单的自己写的小案例
1.准备工作,新建一个目录来使用外部共享库和头文件
1.1main.cpp
注意主函数要包扩调用动态库的头文件,最好给出头文件路径
1.2 ./CMakelist.txt
#CMakeLists.txt
PROJECT (HELLO)
ADD_SUBDIRECTORY(src bin)
1.3 ./src/CMakeList.txt
ADD_EXECUTABLE(hello main.cpp)
1.4
hello.h路径:usr/local/hello/hello.h
静态库动态库安装到usr/lib目录
编译会出现以下问题
常见问题解决
解决:make后头文件找不到的问题
PS:include <hello/hello.h> 这样include是可以,这么做的话,就没啥好讲的了
关键字:INCLUDE_DIRECTORIES 这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割在src/CMakeLists.txt中加入头文件搜索路径
INCLUDE_DIRECTORIES(/usr/include/hello)
解决:找到引用的函数问题
报错信息:undefined reference to `HelloFunc()’
关键字:LINK_DIRECTORIES 添加非标准的共享库搜索路径
关键字:TARGET_LINK_LIBRARIES 添加需要链接的共享库
在CMakeLists.txt中插入链接共享库,主要要插在executable的后面
TARGET_LINK_LIBRARIES(main libhello.so)
查看main的链接情况
[root@MiWiFi-R4CM-srv bin]# ldd main
linux-vdso.so.1 => (0x00007ffedfda4000)
libhello.so => /lib64/libhello.so (0x00007f41c0d8f000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f41c0874000)
libm.so.6 => /lib64/libm.so.6 (0x00007f41c0572000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f41c035c000)
libc.so.6 => /lib64/libc.so.6 (0x00007f41bff8e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f41c0b7c000)
链接静态库:
TARGET_LINK_LIBRARIES(hello libhello.a)
最终的CMakeList.txt文件为
INCLUDE_DIRECTORIES(/usr/include/hello)
ADD_EXECUTABLE(hello main,cpp)
TARGET_LINK_LIBRARIES(hello libhello.a)#hello与生成可执行文件一致
cd build
cmake ..
make
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)