栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【CMAKE】入门与语法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【CMAKE】入门与语法

Why CMake

一个c++程序,编译过程中最关键的就是编译和链接,链接需要的是各种静态.a和动态.so .dll的库文件(里面存放着真正运行的逻辑)。 同时也需要include头文件(头文件用于定义函数,不包含实现。这么拆分之后,就可以让用户只看到api,无法看到实现源码了)。 那么cmake就能够很好地解决程序应该去哪里去寻找到这些链接库文件的问题

更多可关注

计算机视觉-Paper&Code - 知乎

有能力的同学可以直接参考cmake官方

FindPython — CMake 3.23.0-rc5 documentation

一些常用语法

一个标准,添加了opencv的的cmake看起来是这样的

cmake_minimum_required (VERSION 3.8)

project ("CMakeProject1")

set(INC_DIR D:/opencv/opencv/build/include/)  # 找到自己的路径
set(link_DIR D:/opencv/opencv/build/x64/vc15/lib)  # 找到自己的路径
 
include_directories(${INC_DIR})
link_directories(${link_DIR})
link_libraries(opencv_world) 

add_executable (CMakeProject1 "CMakeProject1.cpp" "CMakeProject1.h")

 如果去掉include_directories(${INC_DIR}),则程序无法找到引用的头文件,也就找不到函数的api

无法找到文件,打开包括文件  no such file or directory

 如果去掉link_directories(${link_DIR}),则程序无法找到.lib文件,

fatal error LNK1104: 无法打开文件 opencv_world.lib

如果去掉 link_libraries(opencv_world) ,会导致程序无法正常找到编译后的dll动态链接库的位置,也就找不到实现

D:workcmakeCMakeProject1outbuildx64-DebugCMakeProject1CMakeProject1.cpp.obj : error LNK2019: 无法解析的外部符号 "void __cdecl cv::circle(class cv::debug_build_guard::_InputOutputArray const &,class cv::Point_,int,class cv::Scalar_ const &,int,int,int)" (?circle@cv@@YAXAEBV_InputOutputArray@debug_build_guard@1@V?$Point_@H@1@HAEBV?$Scalar_@N@1@HHH@Z),函数 main 中引用了该符号
D:workcmakeCMakeProject1outbuildx64-DebugCMakeProject1CMakeProject1CMakeProject1.exe : fatal error LNK1120: 7 个无法解析的外部命令

TARGET_link_LIBRARIES

由于官方推荐,因此重点介绍TARGET_link_LIBRARIES (设置要链接的库文件的名称)
语法:TARGET_link_LIBRARIES(targetlibrary1 library2 ..)
TARGET_link_LIBRARIES(myProject hello),连接libhello.so库
TARGET_link_LIBRARIES(myProject libhello.a)
TARGET_link_LIBRARIES(myProject libhello.so)

官网不推荐使用link_directoris这里就不介绍了,而是推荐使用find_package和find_library寻找共享库的绝对路径,再传给target_link_libraries使用。同样如果我们使用find,那么以上的cmake就会变成

cmake_minimum_required (VERSION 3.8) 
set(INC_DIR D:/opencv/opencv/build/include/)  # 找到自己的路径

include_directories(${INC_DIR})
find_package(OpenCV REQUIRED)   # 

add_executable (CMakeProject1 "CMakeProject1.cpp" "CMakeProject1.h")

target_link_libraries(CMakeProject1 ${OpenCV_LIBRARIES})    # OpenCV python.lib 库

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/779247.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号