主体框架:
工程配置部分:工程名,编译调试模式,编译系统语言
依赖部分:工程包,头文件,依赖库等
其他辅助:参数打印,遍历目录等
判断控制部分:条件判断,函数定义,条件执行等
源文件(.h , .cpp等) ——> 预编译——>编译——>汇编——>链接——>可执行文件
静态库:链接阶段,库中目标文件所含的所有将被程序使用的函数的机器码,被copy到最终的可执行文件中。
特点
1.静态库对函数库的链接是放在编译时期完成的;
2.程序在运行时与函数库再无瓜葛, 移植方便;
3.运行效率相对快;
4.占用磁盘和内存空间,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。
静态库的局限性:
1.空间浪费是静态库的一个问题;
2.静态库对程序的更新、部署和发布页会带来麻烦;
3.如果静态库lib更新了,所以使用它的应用程序都需要重新编译、发布给用户;
4.对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新。
5.若静态库占用1M内存,有2000个这样的程序,将占用近2G的空间。
动态库:程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。
特点
1.可执行文件只包含它需要的函数的引用表,而不是所有的函数代码;
2.只有在程序执行时, 那些需要的函数代码才被拷贝到内存中。
3.动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
4.但依赖的模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息,依赖性强。
总结:
一般在比较固定参数的工程项目中,如底层驱动逻辑比较稳定,会考虑静态库的使用;
在需要多次调试优化版本中,比如PUBG (吃鸡) 的游戏平衡体验更新,会考虑动态库的使用。
简单的指令;
对于${X},X代表变量名称,${X}表示变量值,if语句除外。导入功能函数,如SET大小写均可,没有限制。
ADD_DEFINITIONS: 为源文件的编译添加由-D引入的宏定义。
格式为add_definitions(-DFOO -DBAR...)
INSTALL: 用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等。
OPTION 提供用户可以选择的选项.
ADD_CUSTOM_COMMAND
ADD_CUSTOM_TARGET
[COMMAND] : 为工程添加一条自定义的构建规则。
[TARGET] : 用于给指定名称的目标执行指定的命令,该目标没有输出文件,并始终被构建。
TARGET_INCLUDE_DIRECTORIES: 设置include文件查找的目录,具体包含头文件应用形式,安装位置等。
SET_TARGET_PROPERTIES : 设置目标的一些属性来改变它们构建的方式。
ENABLE_TESTING: 用来控制Makefile是否构建test目标
ADD_TEST: 一般需要和enable_testing()配合使用。
如 ADD_TEST(mytest ${project_binary_dir}/bin/main ENABLE_TESTING)
add_library(XXX STATIC/SHARED xxxx)生成XXX的静、动态库。静态库.a 动态库.so
下面是例子
cmake_minimum_required(VERSION 2.8.12) #CMake 最低版本号要求
project(examples) #项目信息
set(CMAKE_CXX_FLAGS "XXX") #设定编译器选项
set(CMAKE_BUILD_TYPE "XXX") #设定编译器模式,如Debug/Release
include(../dlib/cmake)
add_executable(assignment_learning_ex assignment_learning_ex.cpp)
target_link_libraries(assignment_learning_ex dlib::dlib)
macro(add_example name)
add_executable(${name} ${name}.cpp) #添加执行文件
target_link_libraries(${name} dlib::dlib ) #将库文件链接链接到当前执行文件
add_dependencies(${name} ....) #添加依赖到当前执行文件
endmacro()
macro(add_gui_example name)
if (DLIB_NO_GUI_SUPPORT)
message("No GUI support, so we won't build the ${name} example.")
else()
add_example(${name})
endif()
endmacro()
if (NOT USING_OLD_VISUAL_STUDIO_COMPILER)
add_example(dnn_metric_learning_ex)
if (NOT MSVC)
add_example(dnn_imagenet_train_ex)
add_example(dnn_metric_learning_on_images_ex)
endif()
endif()
if (DLIB_NO_GUI_SUPPORT)
message("No GUI support, so we won't build the webcam_face_pose_ex example.")
else()
find_package(OpenCV QUIET) #导入库文件
if (OpenCV_FOUND) #如果找到库
include_directories(${OpenCV_INCLUDE_DIRS}) #添加库的头文件路径
add_executable(webcam_face_pose_ex webcam_face_pose_ex.cpp)
target_link_libraries(webcam_face_pose_ex dlib::dlib ${OpenCV_LIBS} )
else()
message("OpenCV not found, so we won't build the webcam_face_pose_ex example.")
# message( [STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR]"message to display" ...)
# 1.(无) = 重要消息;
# 2.STATUS = 非重要消息;
# 3.WARNING = CMake 警告, 会继续执行;
# 4.AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
# 5.SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
# 6.FATAL_ERROR = CMake 错误, 终止所有处理过程;
endif()
endif()
#here we apply our macros
add_gui_example(3d_point_cloud_ex)
add_example(bayes_net_ex)
if (DLIB_LINK_WITH_SQLITE3)
add_example(sqlite_ex)
endif()
来源:CSDN
作者:去你个锤子
链接:https://blog.csdn.net/weixin_44152895/article/details/103765925