网站版权问题施工企业安全生产责任制度范本

diannao/2026/1/19 13:44:18/文章来源:
网站版权问题,施工企业安全生产责任制度范本,导航网站网站提交怎么做,免费微信网站模板下载工具C程序编译、链接与项目构建 摘要C编译环境静、动态库介绍gcc与g和程序编译、链接Visual Studio创建和链接库动态库的显示调用 Make介绍安装使用 CMake介绍安装使用构建方式内部构建外部构建构建使用静/动态库常用[系统]变量常用指令CMake模块 Make与CMake的联系与区别 摘要 本… C程序编译、链接与项目构建 摘要C编译环境静、动态库介绍gcc与g和程序编译、链接Visual Studio创建和链接库动态库的显示调用 Make介绍安装使用 CMake介绍安装使用构建方式内部构建外部构建构建使用静/动态库常用[系统]变量常用指令CMake模块 Make与CMake的联系与区别 摘要 本篇博客对C/C程序的编译环境、库创建链接、Make和CMake工具的使用进行介绍以便加深理解和记忆 C编译环境 C编译环境 GNUGNU’s Not UnixGNU是一个自由软件运动的项目旨在开发一个类Unix操作系统。GNU项目创建了一系列工具和库为开发者提供了自由的软件开发环境。其中包括GCC编译器、MinGW和其他开发工具。GNU以开源和自由软件的理念而闻名为用户提供了更大的自由度和可定制性。 GCCGNU Compiler CollectionGCC是GNU项目的核心组件之一也是一个开源的编译器集合。它支持多种编程语言包括C、C、Objective-C、Fortran等。GCC是一个跨平台的编译器提供了许多优化选项和功能以生成高质量的可执行文件。最早名为GNU Compiler C针对C MinGWMinimalist GNU for WindowsMinGW是一个开源的软件开发工具集旨在为Windows提供GNU开发环境。它包含了一组用于Windows的头文件和库文件以及GCCGNU Compiler Collection编译器。MinGW使得开发者能够在Windows上开发和编译使用GNU工具链的应用程序它提供了一种轻量级的方式在Windows环境下进行开发。 MSVCMicrosoft Visual C:MSVC是微软公司开发的一款C编译器和集成开发环境IDE。它是Windows平台上最常用的C开发工具之一。MSVC提供了丰富的开发工具、调试功能和图形化界面使得Windows开发变得更加便捷。 区别与联系MinGW和GCC都属于GNU项目的一部分它们提供了在Windows环境下进行GNU开发的工具和编译器。GCC是跨平台的编译器集合MinGW专注于在Windows上提供GNU工具链的支持 静、动态库 介绍 什么是库 库是写好的成熟的可复用的代码。本质上来说库是一种可执行代码的二进制形式可以被OS载入内存执行。库有两种静态库.a、.lib和动态库.so、.dll 静态库 概念链接阶段会将汇编生成的目标文件.o/.obj与依赖的静态库.lib一起打包到可执行文件中。一个静态库可以简单地看成一组目标文件.o/.obj的集合即很多目标文件经过压缩打包形成的一个文件特点 程序对静态库的链接是在编译时完成的可执行程序在运行时与静态库再无瓜葛移植方便因为静态库在编译阶段就已被目标程序链接到一起生成可执行文件通过静态链接的可执行程序体积通常较大因为链接到一起时会占用较多空间 静态库包含的内容 .a/.lib二进制文件它是静态库实际的内容.h头文件它是静态库中函数、变量、宏定义的声明以供引用并使用 动态库 为何需要动态库动态库的出现是为了解决静态库的一些不足 空间浪费 静态库更新带来的程序全量更新问题如果静态库更新了依赖于它的应用程序都需要重新编译、发布给用户对于用户来说可能是一个很小的改动却导致整个程序重新下载全量更新 动态库在程序编译时并不会被连接到目标代码中而是在程序运行是才被载入。不同的应用程序如果调用相同的库那么在内存里只需要有一份该共享库的实例规避了空间浪费问题。动态库在程序运行是才被载入也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可增量更新。 特点 动态库把库函数的链接载入推迟到程序运行的时期可以实现进程之间的资源共享因此动态库也称为共享库将程序更新变得简单可以真正做到链接载入完全由程序员在程序代码中控制显示调用 动态库包含的内容 .dll/.so文件动态库的实际内容.lib动态库的入口文件.h动态库的声明头文件以供程序引入和使用 gcc与g和程序编译、链接 gcc与g的联系与区别 gcc与g都是GNU(组织)的一个编译器 gcc与g都可以编译c代码与c代码。但是后缀为.c的gcc把它当做C程序而g当做是C程序后缀为.cpp的两者都会认为是C程序 编译可以用gcc/g而链接可以用g或者gcc -lstdc。因为gcc命令不能自动和C程序使用的库联接当然可以选择手动链接使用命令如下所以通常使用g来完成联接。但在编译阶段g会自动调用gcc二者等价 gcc编译过程 预处理处理#开头的语句进行文本替换 gcc -E hello.c -o hello.i编译检查代码规范性和语法错误将程序编译为汇编代码语法检查、代码优化 gcc -S hello.i -o hello.s汇编将汇编代码转换为二进制目标文件机器可识别 gcc -c hello.s -o hello.o链接将目标文件链接成最终可执行程序处理目标文件间的依赖关系 gcc hello.o -o hello静态链接库 创建静态链接库 # 将所有指定的源文件都编译成相应的目标文件 g -c greeting.cpp name.cpp # greeting.cpp name.cpp greeting.o name.o greeting.h name.h # 将生成的目标文件打包成静态链接库可以将多个目标文件打成一个链接库 # 静态链接库的不能随意起名需遵循如下的命名规则libxxx.a/libxxx.lib ar rcs libmyfunction.a name.o greeting.o 链接静态链接库 # 将主文件编译为目标文件 g -c main.cpp # 链接 g -static main.o libmyfunction.a # -L注定路径-l指定库名称中间一般不加空格 # g -static main.o -L /home/wohu/cpp/src -lmyfunction动态链接库 创建动态链接库 # 1.直接使用源文件创建动态链接库 # -shared 选项用于生成动态链接库 # -fpic还可写成 -fPIC选项的功能是令 GCC 编译器生成动态链接库多个目标文件的压缩包时表示各目标文件中函数、类等功能模块的地址使用相对地址而非绝对地址。这样无论将来链接库被加载到内存的什么位置都可以正常使用 gcc -fpic -shared 源文件名... -o 动态链接库名# 2.先使用 gcc -c 指令将指定源文件编译为目标文件再由目标文件生成动态链接库 g -c -fPIC name.cpp greeting.cpp # 生成动态链接库 g -shared greeting.o name.o -o libmyfunction.so链接动态链接库 g main.cpp libmyfunction.so -o mainVisual Studio创建和链接库 静态库 创建静态库 使用VS新建项目 → 选择Win32控制台程序 → 选择应用程序设置 → 勾选静态库 → 编写静态库 → Build项目 链接静态库 方法一引用的静态库是同一解决方案下的子工程 项目 → 属性 → 项目依赖项在欲引用静态库的项目中点选静态库依赖项 右键欲引用静态库的项目 → 属性 → 配置属性 → C/C → 常规 → 在附加包含目录中键入静态库{name}.h头文件所在文件夹的路径 方法二右键欲引用静态库的项目 → 属性 → 配置属性 → 链接器 → 命令行在其他选项中键入完整的静态库.lib路径 方法三 右键欲引用静态库的项目 → 属性 → 配置属性 → 链接器 → 常规 → 附加库目录中键入静态库所在的目录右键欲引用静态库的项目 → 属性 → 配置属性 → 链接器 → 输入 → 附加依赖项中输入静态库的名称{name}.lib 动态库 创建动态库 创建项目 项目结构 pch是预编译头文件通常将一些不怎么变动的头文件预先编译加快工程编译速度 dllmain.cpp是dll程序的主文件其中DllMain函数是dll的入口点每次这个dll被加载都会执行DllMain然后根据运行时状态执行不同的命令 // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include pch.hBOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH: //被程序加载时执行case DLL_THREAD_ATTACH: //被线程加载时执行case DLL_THREAD_DETACH: //被线程卸载时执行case DLL_PROCESS_DETACH: //被程序卸载时执行break;}return TRUE; }编写自定义的DLL函数 c // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include pch.hBOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE; }//编写函数 pch.h里面记得要添加includeiostream void test1() {std::cout test1 is worked\n; }void test2() {std::cout test2 is worked\n; }将函数或对象暴露给外界编写完函数或对象外界还是无法执行的这就像js里的模块化编程需要将想要给外界使用的功能暴露export出来 方法一在函数名(对象)前加入暴露给外界的关键字 C __declspec(dllexport) void test1() {std::cout test1 is worked\n; }CC支持函数名重载方法是将原有函数名粉碎向函数名中添加关于参数的信息就是说原来的函数名就是test1但C会粉碎成test1YAXXZ这样的名字这也就导致了我们暴露出去的函数名其实根本不是test1。为了解决这个问题只需要在编写dll的时候在函数前告诉编译器用C风格来暴露test函数就不会被粉碎函数名了 extern C __declspec(dllexport) void test1() {std::cout test1 is worked\n; }实际在C中我们更倾向于通过对象的方式将方法暴露给外界 class __declspec(dllexport) test {test() {}; };方法二 使用模块定义文件(.def)右键项目 → 添加项 → 新建项 → 选择模块定义文件创建 自定义名称并在文件中写入.def文件中以;作为注释符 LIBRARY {dll_project_name} ;LIBRAY后面跟dll的项目名称 EXPORTS ;EXPORTS代表后面的都是要export出去的函数 test2 ;一行一个函数名生成dll在vs的顶部工具栏依次点击生成 → 生成dll测试 → dll文件在项目文件夹的debug目录 链接动态库 方法一同一解决方案 右键项目 → 属性 → 通用属性 → 引用 → 添加新引用右键项目 → 属性 → 配置属性 → C/C → 常规 → 附加包含目录 键入动态库.h头文件的路径 方法二不要求同一解决方案 右键项目 → 属性 → 配置属性 → 链接器 → 常规 → 附加依赖库目录 键入动态库所在目录 右键项目 → 属性 → 配置属性 → 连接器 → 输入 → 附加目录 键入动态库对应的.lib文件dll的入口 动态库的显示调用 Linux#include dlfcn.h void * dlopen( const char * pathname, int mode )函数以指定模式打开指定的动态连接库文件并返回一个句柄给调用进程 void* dlsym(void* handle,const char* symbol)dlsym根据动态链接库操作句柄(pHandle)与符号(symbol)返回符号对应的地址。使用这个函数不但可以获取函数地址也可以获取变量地址 int dlclose (void *handle)dlclose用于关闭指定句柄的动态链接库只有当此动态链接库的使用计数为0时,才会真正被系统卸载 const char *dlerror(void)当动态链接库操作函数执行失败时dlerror可以返回出错信息返回值为NULL时表示操作函数执行成功 Windows //main.cpp : 测试动态链接库 #include iostream// 函数指针定义了一个类型名为fun的指向空的函数指针 // https://blog.csdn.net/qq_35621436/article/details/106085752 typedef void(*func)(); int main(void) {/**引入要加载的动态链接库HMODULE点进去看的话其实是HINSTANCE的一个别名就是一个句柄如果获取到了会返回这个动态库的句柄否则返回NULL**/HMODULE dlltest LoadLibraryW(L{name}.dll);if (dlltest){/**获取函数名所在的地址即函数指针获取到的地址默认是void类型因此要自己定义一个函数指针进行强制类型转换**/func test (func)GetProcAddress(dlltest, test);if (test) {test();}else {MessageBoxW(NULL, L找不到test方法, LERROR, NULL);}}else {MessageBoxW(NULL,L找不到dll,LERROR,NULL);} }Make Make - GNU Project - Free Software Foundation 跟我一起写Makefile — 跟我一起写Makefile 1.0 文档 (seisman.github.io) 介绍 Make 是一种流行的构建工具常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作提高开发效率。 Make 使用 Makefile 文件描述项目的构建过程其中包含了源文件、目标文件以及编译和链接的命令等信息。Makefile 按照一定的规则解析将源码和构建过程相互关联起来执行具体的构建操作生成目标文件或可执行文件 Make 工具的优势在于它可以识别哪些文件被修改了只编译修改过的部分以提高构建速度。此外Make 工具还支持基于条件的编译也就是预处理器(preprocessor)功能可以生成不同的输出文件用于不同的平台或不同的运行环境 Make 工具具有很好的跨平台性可以在 Unix/Linux、Windows、Mac 等多种操作系统上使用并且可以与多种编程语言搭配使用如 C、C、Java 等 安装 Linux Windows Make for Windows (sourceforge.net)实际基于MinGW推荐后者 MinGW - Minimalist GNU for Windows download | SourceForge.net 下载安装将Bin目录加入到系统环境变量中 运行MinGW Installer勾选所需的包点击左上角的Installation点击Apply Change 将mingw32-make.exe更名为make.exe方便使用 使用 CMake CMake官网 CMake官方中文文档 CMake-Practice-zh-CN: CMake 实践 (github.com) 《CMake Best Practices》的非专业个人翻译 (github.com) 介绍 CMake是一种管理源代码构建的工具被广泛用于C/C项目 使用的工具链cmake make。通过cmake语法编写CMakeLists.txt文件描述项目的构建属性和配置并进行自动化的项目构建可执行二进制文件、静/动态库 开源、高效率 跨平台在Linux/Unix平台生成makefile在Mac平台生成xcode在Windows平台可以生成MSVC工程文件 可扩展可为cmake编写特定功能的模块扩展cmake功能 安装 各大Linux发行版都集成了cmake无需手动安装。如需安装可从官网上下载安装 使用 构建方式 内部构建 外部构建推荐的方式在源CMakeLists.txt所在的文件夹下新建build目录或其他任意位置在该位置下键入cmake ..或cmake 源工程路径此时区分出了PROJECT_SOURCE_DIR和PROJCT_BINARY_DIR 内部构建 源码和构建中间、目标在同一目录下将hello.c和CMakeLists.txt放入同一目录 # 注意命令和括号之间没有空格 CMAKE_MINIMUM_REQUIRED(VERSION 3.29)#[[指定项目信息该声明隐式地定义了两个变量项目名_BINARY_DIR和项目名_BINARY_DIR 它们指向了当前CMakeLists.txt文件的路径更好的替代方式是PROJECT_SOURCE_DIR和 PROJCT_BINARY_DIR它们可以避免由项目名称更改造成的问题 PROJECT (项目名VERSION 版本号DESCRIPTION 项目介绍LANGUAGE C) ]] PROJECT(hello)#[[打印信息MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] message to display)SEND_ERROR产生错误生成过程被跳过SATUS输出前缀为—的信息FATAL_ERROR立即终止所有 cmake 过程 ]] # 注意除IF语句中变量的使用方式为${} MESSAGE(STATUS This is Projct BINARY dir ${项目名_BINARY_DIR}) MESSAGE(STATUS This is Projct SOURCE dir ${项目名_SOURCE_DIR})# 显示定义变量SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) # 变量值可以用双引号标识以应对存在空格的情况SET(SRC_LIST “fu nc.c”) SET(SRC_LIST hello.c)# 添加要构建可执行文件的源文件和输出文件此时表示可执行文件为hello源文件列表为SRC_LIST变量 # 多个参数可以使用空格或分号分隔ADD_EXECUTABLE(hello main.c;func.c) ADD_EXECUTABLE(hello ${SRC_LIST})cmake .外部构建 注意CMake需要在任何子目录中建立一个CMakeLists.txt如下将源文件放入src文件夹中src文件夹中也需要创建一个 - root# 源文件- src# 源码hello.cCMakeLists.txt# 文档- doc# 版权说明、自述文件COPYRIGHT.txtREADME.txt# bat脚本用于调用二进制可执行文件run.bat# 构建后的目标文件夹- bin# 构建目录- buildCMakeLists.txt# /src/CMakeLists.txt ADD_EXECUTABLE(hello hello.c)# 指定最终的目标二进制的位置(指最终生成的 hello 或者最终的共享库不包含编译生成的中间文件) # 内部编译下PROJECT_BINARY_DIR是当前目录外部编译下PROJECT_BINARY_DIR是构建目录 # 与下面的ADD_SUBDIRECTORY用途相同在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY就在哪改变路径 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)# /CMakeLists.txt CMAKE_MINIMUM_REQUIRED(VERSION 3.12...3.29)Project(hello)# 向当前工程添加存放源文件的子目录并可以指定中间二进制和目标二进制存放的位置 # ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) # EXCLUDE_FROM_ALL 参数的含义是将这个目录从编译过程中排除比如工程的 example可能就需要工程构建完成后再进入 example 目录单独进行构建 # 将 src 子目录加入工程并指定编译输出(包含编译中间结果)路径为bin 目录。如果不进行 bin 目录的指定那么编译结果(包括中间结果)都将存放在build/src 目录(这个目录跟原有的 src 目录对应) ADD_SUBDIRECTORY(src bin)# 指定安装目录的变量:默认值/usr/local注意Windows下转义字符 SET(CMAKE_INSTALL_PREFIX C:\\Users\\liyifan31\\Desktop\\des)# 安装命令注意FILES、PROGRAMS、DIRECTORY是标识符 #[[# 目标文件安装TARGETS# TARGET参数即是ADD_EXECUTABLE、ADD_LIBRARY定义的目标文件INSTALL(TARGETS targets...# 静态库、动态库、可执行二进制文件 [[ARCHIVE|LIBRARY|RUNTIME]# 定义安装路径若以/开头则是绝对路径CMAKE_INSTALL_PREFIX失效 [DESTINATION dir] [PERMISSIONS permissions...][CONFIGURATIONS[Debug|Release|...]][COMPONENT component][OPTIONAL]] [...])# 普通文件安装INSTALL(FILES files... DESTINATION dir# 定义文件权限默认为OWNER_WRITE,OWNER_READ,GROUP_READ,WORLD_READ即644权限[PERMISSIONS permissions...][CONFIGURATIONS [Debug|Release|...]][COMPONENT component][RENAME name] [OPTIONAL])# 非目标文件的可执行程序安装(比如脚本之类)与FILES相比默认为755权限INSTALL(PROGRAMS files... DESTINATION dir[PERMISSIONS permissions...][CONFIGURATIONS [Debug|Release|...]][COMPONENT component][RENAME name] [OPTIONAL])# 文件夹INSTALL(DIRECTORY dirs... DESTINATION dir[FILE_PERMISSIONS permissions...]# 所在 Source 目录的相对路径。注意abc 和 abc/有很大的区别# 如果目录名不以/结尾那么这个目录将被安装为目标路径下的 abc# 如果目录名以/结尾代表将这个目录中的内容安装到目标路径但不包括这个目录本身[DIRECTORY_PERMISSIONS permissions...][USE_SOURCE_PERMISSIONS][CONFIGURATIONS [Debug|Release|...]][COMPONENT component]# 使用正则表达式进行过滤[[PATTERN pattern | REGEX regex][EXCLUDE] [PERMISSIONS permissions...]] [...])# e.g.# 将 icons 目录安装到 prefix/share/myproj将 scripts/中的内容安装到prefix/share/myprojINSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj# 不包含目录名为 CVS 的目录PATTERN CVS EXCLUDE# 对于 scripts/*文件指定权限为 OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READPATTERN scripts/*PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READGROUP_EXECUTE GROUP_READ) ]]INSTALL(DIRECTORY doc DESTINATION doc) INSTALL(DIRECTORY data DESTINATION data) INSTALL(TARGETS ${PROJECT_BINARY_DIR}\\bin\\Debug\\ DESTINATION bin)cd build cmake ..cmake -DCMAKE_INSTALL_PREFIX/usr make make install构建使用静/动态库 目录结构 CMakeLists.txt - libCMakeLists.txthello.chello.h - build# /lib/CMakeLists.txtSET(LIBHELLO_SRC hello.c)#[[ADD_LIBRARY(libname # SHARED动态库 STATIC静态库 MODULE在使用 dyld 的系统有效# 如果不支持 dyld则被当作 SHARED 对待[SHARED|STATIC|MODULE]# 该库不会被默认构建除非有其他的组件依赖或者手工构建[EXCLUDE_FROM_ALL]source1 source2 ... sourceN ) ]] ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})#[[# 设置输出属性SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...) ]] # 解决静态库和动态库重名/名称不一致的问题 # OUTPUT_NAME 设置输出名称。解决名称不一致问题 # CLEAN_DIRECT_OUTPUT 解决输出时同名文件清除问题 # VERSION 库版本号 # SOVERSION api版本号 SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1 VERSION 1.2 SOVERSION 1) SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME hello CLEAN_DIRECT_OUTPUT 1 VERSION 1.2 SOVERSION 1)# 获取输出属性 GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME) MESSAGE(STATUS “This is the hello_static OUTPUT_NAME:” ${OUTPUT_VALUE})# /CMakeLists.txt Project(hello_lib)ADD_SUBDIRECTORY(lib lib)INSTALL(TARGETS hello hello_staticLIBRARY DESTINATION libARCHIVE DESTINATION lib ) INSTALL(FILES hello.h DESTINATION /include)使用静态库和动态库 新建项目在根路径下创建src文件夹和CMakeLists.txt在src文件夹下创建sort_test.c和CMakeLists.txtsort.c中引用刚才的库头文件 # /src/CMakeLists.txt#[[ # 向工程添加多个特定的头文件搜索路径路径之间用空格分割# 通过 AFTER 或者 BEFORE 参数控制追加到当前的头文件搜索路径的后面还是前面INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) ]] INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/extra/sort/include) # 通过 SET 这个 cmake 变量为 on可以将添加的头文件搜索路径放在已有路径的前面 # SET(CMAKE_INCLUDE_DIRECTORIES_BEFORE ON)# 为target添加共享库路径之间用空格分割 LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/extra/sort/lib/WIN32) #[[链接 TARGET_LINK_LIBRARIES(target library1debug | optimized library2 ...) ]] # 动态 TARGET_LINK_LIBRARIES(sort_test sort.dll) # 静态 TARGET_LINK_LIBRARIES(sort_test sort.lib)#[[特殊的系统环境变量注意不是CMake变量CMAKE_INCLUDE_PATH、CMAKE_LIBRARY_PATH# 修改这两个环境变量到系统共存的第三方库环境变量 ]] # 在环境变量中找sort.h的路径添加到myHeader变量中 FIND_PATH(myHeader sort.h) # 指定路径 # FIND_PATH(myHeader NAMES sort.h PATHS /usr/include /usr/include/sort) # 判空 IF(myHeader) # 添加到include目录 INCLUDE_DIRECTORIES(${myHeader}) ENDIF(myHeader)# 注意搜索路径应该添加到可执行文件前 ADD_EXECUTABLE(sort_test sort_test.c)/CmakeLists.txt Project(sort_lib) ADD_SUBDIRECTORY(src bin)常用[系统]变量 常用变量 常用变量含义说明CMAKE_BINARY_DIRPROJECT_BINARY_DIR projectname_BINARY_DIR工程编译发生的目录CMAKE_SOURCE_DIRPROJECT_SOURCE_DIR_SOURCE_DIR工程顶层目录CMAKE_CURRENT_SOURCE_DIR当前处理的 CMakeLists.txt 所在的路径CMAKE_CURRRENT_BINARY_DIRtarget 编译目录ADD_SUBDIRECTORY(src bin)可以更改这个变量的值CMAKE_CURRENT_LIST_FILE调用这个变量的 CMakeLists.txt 的完整路径CMAKE_CURRENT_LIST_LINE输出这个变量所在的行CMAKE_MODULE_PATH定义自己的 cmake 模块所在的路径如果工程比较复杂有可能会自己编写一些 cmake 模块这些 cmake 模块是随你的工程发布的为了让 cmake 在处理 CMakeLists.txt 时找到这些模块你需要通过 SET 指令将自己的 cmake 模块路径设置一下EXECUTABLE_OUTPUT_PATHLIBRARY_OUTPUT_PATH重新定义最终结果的存放目录PROJECT_NAME返回通过 PROJECT 指令定义的项目名称 系统变量 # 调用系统的环境变量 $ENV{NAME} # 设置环境变量 SET(ENV{变量名} 值)环境变量含义说明CMAKE_INCLUDE_CURRENT_DIR自动添加 CMAKE_CURRENT_BINARY_DIR 和CMAKE_CURRENT_SOURCE_DIR 到当前处理的 CMakeLists.txt相当于在每个 CMakeLists.txt 加入INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}${CMAKE_CURRENT_SOURCE_DIR})CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE将工程提供的头文件目录始终至于系统头文件目录的前面当定义的头文件确实跟系统发生冲突时可以提供一些帮助 系统信息 系统信息含义CMAKE_MAJOR_VERSIONCMAKE 主版本号比如 2.4.6 中的 2CMAKE_MINOR_VERSIONCMAKE 次版本号比如 2.4.6 中的 4CMAKE_PATCH_VERSIONCMAKE 补丁等级比如 2.4.6 中的 6CMAKE_SYSTEM系统名称比如 Linux-2.6.22CMAKE_SYSTEM_NAME不包含版本的系统名比如 LinuxCMAKE_SYSTEM_VERSION系统版本比如 2.6.22CMAKE_SYSTEM_PROCESSOR处理器名称比如 i686UNIX在所有的类 UNIX 平台为 TRUE包括 OS X 和 cygwinWIN32在所有的 win32 平台为 TRUE包括 cygwin 开关选项 开关选项含义MAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS用来控制 IF ELSE 语句的书写方式BUILD_SHARED_LIBS控制默认的库编译方式默认为静态库CMAKE_C_FLAGS设置C编译选项也可以通过指令ADD_DEFINITIONS()添加CMAKE_CXX_FLAGS设置C编译选项也可以通过指令ADD_DEFINITIONS()添加 常用指令 # 1.向CC编译器添加-D定义 # 如果你的代码中定义了#ifdef ENABLE_DEBUG #endif这个代码块就会生效。 # 如果要添加其他的编译器开关可以通过 CMAKE_C_FLAGS 变量和 CMAKE_CXX_FLAGS 变量设置 ADD_DEFINITIONS(-DENABLE_DEBUG -DABC)# 2.定义 target 依赖的其他 target确保在编译本 target 之前其他的 target 已经被构建 ADD_DEPENDENCIES(target-name depend-target1 depend-target2 ...)# 3.ADD_TEST(testname Exename arg1 arg2 ...) # testname 是自定义的 test 名称Exename 可以是构建的目标文件也可以是外部脚本等等后面连接传递给可执行文件的参数。 # 如果没有在同一个 CMakeLists.txt 中打开ENABLE_TESTING()指令任何 ADD_TEST 都是无效的 ADD_TEST(mytest ${PROJECT_BINARY_DIR}/bin/main) # 4.控制 Makefile 是否构建 test 目标涉及工程所有目录一般情况这个指令放在工程的主CMakeLists.txt 中 ENABLE_ESTING() # 5.发现一个目录下所有的源代码文件并将列表存储在一个变量中这个指令临时被用来自动构建源文件列表 AUX_SOURCE_DIRECTORY(dir VARIABLE)# 6.在指定的目录运行某个程序通过 ARGS 添加参数如果要获取输出和返回值 # 可通过 OUTPUT_VARIABLE 和 RETURN_VALUE 分别定义两个变量 # 该指令可以在 CMakeLists.txt 处理过程中支持任何命令如根据系统情况去修改代码文件 # 在 CMakeLists.txt 处理过程中执行命令并不会在生成的 Makefile 中执行 EXEC_PROGRAM(Executable [directory in which to run][ARGS arguments to executable][OUTPUT_VARIABLE var][RETURN_VALUE var]) # 在 src 目录执行 ls 命令并把结果和返回值存下来 EXEC_PROGRAM(ls ARGS *.c OUTPUT_VARIABLE LS_OUTPUT RETURN_VALUELS_RVALUE) IF(not LS_RVALUE) MESSAGE(STATUS ls result: ${LS_OUTPUT}) ENDIF(not LS_RVALUE)# 7.文件操作指令 FILE(WRITE filename message to write... ) FILE(APPEND filename message to write... ) FILE(READ filename variable) FILE(GLOB variable [RELATIVE path] [globbing expressions]...) FILE(GLOB_RECURSE variable [RELATIVE path][globbing expressions]...) FILE(REMOVE [directory]...) FILE(REMOVE_RECURSE [directory]...) FILE(MAKE_DIRECTORY [directory]...) FILE(RELATIVE_PATH variable directory file) FILE(TO_CMAKE_PATH path result) FILE(TO_NATIVE_PATH path result)# 8.载入 CMakeLists.txt 文件也用于载入预定义的 cmake 模块 # OPTIONAL 参数的作用是文件不存在也不会产生错误 # 可以指定载入一个文件如果定义的是一个模块那么将在CMAKE_MODULE_PATH中 # 搜索这个模块并入。载入的内容将在处理到 INCLUDE 语句是直接执行。 INCLUDE(file1 [OPTIONAL]) INCLUDE(module [OPTIONAL])# 9.Find # VAR 变量代表找到的文件全路径包含文件名 FIND_FILE(VAR name1 path1 path2 ...) # VAR 变量表示找到的库全路径包含库文件名 FIND_LIBRARY(VAR name1 path1 path2 ...) # e.g. FIND_LIBRARY(libX X11 /usr/lib) IF(NOT libX) MESSAGE(FATAL_ERROR “libX not found”) ENDIF(NOT libX) # VAR 变量代表包含这个文件的路径 FIND_PATH(VAR name1 path1 path2 ...) # VAR 变量代表包含这个程序的全路径 FIND_PROGRAM(VAR name1 path1 path2 ...) # 调用预定义在 CMAKE_MODULE_PATH 下的 Findname.cmake 模块 # 也可以自己 定义Findname模块通过SET(CMAKE_MODULE_PATH dir)将其放入工程的某个目录中供工程使用 FIND_PACKAGE(name [major.minor] [QUIET] [NO_MODULE][[REQUIRED|COMPONENTS] [componets...]])# 10.IF指令 IF(expression)# THEN section.COMMAND1(ARGS ...)COMMAND2(ARGS ...)...ELSE(expression)# ELSE section.COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDIF(expression) # 凡是出现 IF 的地方一定要有对应的 ENDIF。出现 ELSEIF 的地方ENDIF 是可选的 # IF(var)如果变量不是空0N, NO, OFF, FALSE, NOTFOUND 或var_NOTFOUND 时表达式为真。 # IF(NOT var )与上述条件相反 # IF(var1 AND var2)当两个变量都为真是为真。 # IF(var1 OR var2)当两个变量其中一个为真时为真。 # IF(COMMAND cmd)当给定的cmd确实是命令并可以调用是为真。 # IF(EXISTS dir)或者IF(EXISTS file)当目录名或者文件名存在时为真。 # IF(file1 IS_NEWER_THAN file2)当 file1 比 file2 新或者 file1/file2 其 中有一个不存在时为真文件名请使用完整路径。 # IF(IS_DIRECTORY dirname)当dirname是目录时为真 # 正则匹配 IF(variable MATCHES regex) IF(string MATCHES regex) # IF(hello MATCHES ell) MESSAGE(true) ENDIF(hello MATCHES ell# 数字比较表达式 IF(variable LESS number) IF(string LESS number) IF(variable GREATER number) IF(string GREATER number) IF(variable EQUAL number) IF(string EQUAL number))# 按照字母序的排列进行比较 IF(variable STRLESS string) IF(string STRLESS string) IF(variable STRGREATER string) IF(string STRGREATER string) IF(variable STREQUAL string) IF(string STREQUAL string)# 判断变量定义IF(DEFINED variable) IF(WIN32)MESSAGE(STATUS “This is windows.”) # 作一些 Windows 相关的操作 ELSE(WIN32)MESSAGE(STATUS “This is not windows”) # 作一些非 Windows 相关的操作 ENDIF(WIN32)# 简化ELSE、ENDIF,使用开关语句 SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) # 简化为 IF(WIN32) ELSE() ENDIF() # 配合ELSEIF使用 IF(WIN32) #do something related to WIN32 ELSEIF(UNIX) #do something related to UNIX ELSEIF(APPLE) #do something related to APPLE ENDIF(WIN32)# 11.WHILE WHILE(condition)COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDWHILE(condition)# 12.FOREACH # 列表 AUX_SOURCE_DIRECTORY(. SRC_LIST) FOREACH(F ${SRC_LIST})MESSAGE(${F}) ENDFOREACH(F) # 范围 FOREACH(VAR RANGE 10) MESSAGE(${VAR}) ENDFOREACH(VAR) # 范围和步进 FOREACH(A RANGE 5 15 3) MESSAGE(${A}) ENDFOREACH(A) CMake模块 以往找库链接的过程引入链接 # /src/CMakeLists.txt INCLUDE_DIRECTORIES(/usr/include) TARGET_LINK_LIBRARIES(curltest curl)使用CMake模块 让工程找到 FindHELLO.cmake 模块(存放在工程中的 cmake 目录) # /CMakeLists.txt SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)FIND_PACKAGE可以直接调用预定义的模块 # /src/CMakeLists.txt # 对于系统预定义的 Findname.cmake 模块,都会定义以下几个变量 # 判断模块是否被找到如果没有找到按照工程的需要关闭某些特性、给出提醒或者中止编译 # name_FOUND # 如果 name_FOUND 为真则将 name_INCLUDE_DIR 加入 INCLUDE_DIRECTORIES # 将 name_LIBRARY 加入 TARGET_LINK_LIBRARIES 中 # FIND_PACKAGE(name [major.minor] [QUIET] [NO_MODULE] # [[REQUIRED|COMPONENTS] [componets...]]) FIND_PACKAGE(CURL) IF(CURL_FOUND)INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR})TARGET_LINK_LIBRARIES(curltest ${CURL_LIBRARY}) ELSE(CURL_FOUND)MESSAGE(FATAL_ERROR ”CURL library not found”) ENDIF(CURL_FOUND)自定义CMake模块 编库时项目结构 - CMakeLists.txt- srcCMakeLists.txtcurl.c- cmakeFindCURL.cmake- build# /cmake/FindCURL.cmake FIND_PATH(CURL_INCLUDE_DIR curl.h /usr/include/curl /usr/local/include/curl) FIND_LIBRARY(CURL_LIBRARY NAMES curl PATH /usr/lib /usr/local/lib) IF(CURL_INCLUDE_DIR AND CURL_LIBRARY)SET(CURL_FOUND TRUE) ENDIF(CURL_INCLUDE_DIR AND CURL_LIBRARY) IF(CURL_FOUND)# 根据FIND_PACKAGE中的QUIET参数判断IF(NOT CURL_FIND_QUIETLY)MESSAGE(STATUS Found CURL: ${CURL_LIBRARY})ENDIF(NOT CURL_FIND_QUIETLY) ELSE(CURL_FOUND)# 根据FIND_PACKAGE中的REQUIRED参数判断IF(CURL_FIND_REQUIRED)MESSAGE(FATAL_ERROR Could not find CURL library)ENDIF(CURL_FIND_REQUIRED) ENDIF(CURL_FOUND)Make与CMake的联系与区别 Make用来处理编译顺序和依赖关系并构建最终项目的工具 CMake本身不执行Make过程而是根据不同平台的特性生成对应平台的Makefie这样我们每个工程只要写一个CMake文件即可了其余的交给不同平台的处理器来产生不同的Makefile文件即可。而且CMake的语法也更加简洁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net网站开发 vs2017帝国cms网站搬家

文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…

质感网站系统下载 锐狐免费域名网站申请

jvm gc,gc算法如前一篇文章中所述,HotSpot JVM中有四个可用的垃圾收集器。 它们之间有一些显着差异,但是用于完成实际工作的算法背后的实际概念非常相似。 在这篇简短的文章中,我将尝试解释三种基本算法: 打标 打标紧凑 标记复…

地方门户网站如何推广wordpress升级

文章目录 1.1.单体架构1.2.分布式架构1.3.微服务1.4.SpringCloud1.5.总结 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 微服务架构是一种架构模式&…

英语不好的做网站运营可以吗百度浏览器官网

无极低码 :https://wheart.cn 引言 正则表达式(Regular expressions,也叫 REs、 regexs 或 regex patterns),本质上是嵌入 Python 内部并通过 re 模块提供的一种微小的、高度专业化的编程语言。使用这种小语言&#…

合肥网站制作费用建手机网站的软件有哪些

关于关联查询 首先,请准备一些测试数据,使得:存在若干条用户数据,存在若干条角色数据,某个用户存在与角色的关联,最好有些用户有多个关联,又有些用户只有1个关联,还有些用户没有关联…

做网站为什么一定要留住用户公司网站建设周期及费用

微❤关注“电气仔推送”获得资料(专享优惠) 模型简介 根据传统同步发电机的运行特性设计了MMC-VSG功频控制器和励磁控制器, 实现了MMC-VSG逆变器对高压电网电压和频率的支撑。该模型包含MMC变流器模块,环流抑制模块,…

深圳网站制作建设哪家专业广告制作专业

slf4j 记录日志文件SLF4J是一个非常流行的日志记录外观,但是,就像我们使用的所有库一样,我们有可能以错误的方式或至少以一种非最佳方式使用它。 在本教程中,我们将列出常见的日志记录错误以及如何使用FindBugs检测到它们。 我们…

2019广东省工程建设网站通辽网站建设通辽

目录 1、按位与( & ) 2、按位或( | ) 3.按位异或( ^ ) C语言中的位操作符有以下: & | ^//按位与 //按位或 //按位异或 位运算符是计算两者之间的补码,然后得到的是计算后补…

微信扫一扫抽红包在哪里做网站做网站和app哪类商标

解析模板编译template的背后发生了什么一、📑初识模板编译1、vue组件中使用render代替template2、模板编译总结二、✏️感受模板编译的美1、with语法(1)例子展示🌰(2)知识点归纳三、📈编译模板1…

做网站必备软件自己做的网站怎么发到网上

我试图在PHP中发送HTML电子邮件,但它始终显示电子邮件程序中电子邮件的源代码。但它应该将html电子邮件呈现为html,而不是将源代码显示为电子邮件内容。尝试使用sendmail发送/发送html电子邮件,但显示电子邮件的源代码我把我的邮件是这样的&a…

外卖网站建设价钱房产网二手房

文章目录 1.二叉树层序遍历 2.完全二叉树的判断 文章内容 1.二叉树层序遍历 二叉树的层序遍历需要一个队列来帮助实现。 我们在队列中存储的是节点的地址,所以我们要对队列结构体的数据域重定义, 以上代码 从逻辑上来讲就是1入队,1出队&am…

兰州网站建设模板云南网官网

一、背景 qemu单步调试arm64 linux kernel-CSDN博客介绍了如何单步调试kernel, 但是我们经常写一些测试driver, driver的部分如何调试? 二、环境准备 调试driver 就需要准备一个简单的driver, 这里用最简单的hello world来演示如何调试&am…

如何知道一个网站是谁做的wordpress 搭网站

什么是metadata表 Metadata表即Hudi元数据表,是一种特殊的Hudi表,对用户隐藏。该表用于存放普通Hudi表的元数据信息。Metadata表包含在普通Hudi表内部,与Hudi表是一一对应关系。 元数据表的作用 ApacheHudi元数据表可以显著提高查询的读/写性能。元数据表的主要目的是消…

东莞万江网站制作台州网站搜索优化

优先级类型 React内部对于优先级的管理,贯穿运作流程的4个阶段(从输入到输出),根据其功能的不同,可以分为3种类型: 1 )fiber优先级(LanePriority) 位于 react-reconciler包,也就是L…

免费做图片的网站有哪些网站建设风格

原文在简书首发:http://www.jianshu.com/p/badf412db4e7lua-cmsgpack是一个开源的MessagePack实现方式、纯C的库,没有任何其它依赖,编译后可以直接被lua调用,目前主要支持Lua5.1/5.2/5.3 版本。1、什么是MessagePack?-…

高端网站定制站广西网站建设渠道

目录 一、前言 二、代码 一、前言 有些时候我们需要开启或暂停一些服务,比如说开启Apach或暂停MySQL服务等,最近工作中也开发了这方面的功能,记录下来怎样使用PHP语言来开启或暂停Apache、MySQL服务的运行状态。 这种方法也适用其他服务。…

淘客网站备案wordpress能开发商城网站吗

1. 元件基本介绍 2. 基础元件的使用 3. 表单型元件的使用 4. 菜单与表格元件的使用 使用:如果想使用某个元件,我们只需要将它从元件库中拖入画布摆放即可。 - 对齐:默认情况下,两个矩形元件并排摆放,中间的边框为两…

ps制作网站背景邹城网站定制

一个三电源切换电路 电路描述 1、Q1、Q2为NMOS,Q3、Q4和Q5为PMOS管,D1为二极管。 2、BAT1和BAT2为电池,BAT2的容量比BAT1大,VIN_5V为外部电源,VOUT为输出,给系统供电。 3、VOUT会从优先级高的电源取电&a…

重庆专业企业建设网站网络营销方案范文3篇

原文链接&#xff1a;https://blazor-university.com/components/capturing-unexpected-parameters/捕获意外参数源代码[1]之前我们已经看到了如何使用特定名称声明参数和级联参数。例如&#xff0c;一个将 <img> 元素包装在一些自定义 HTML 中的自定义组件。<div cla…

企业官方网站如何做蓝v认证上海住房和城乡建设局网站

111转载于:https://www.cnblogs.com/zoeeying/p/10139131.html