cmake
文章平均质量分 64
10km
这个作者很懒,什么都没留下…
展开
-
c/c++:CMakeLists.txt中添加编译/连接选项使用内存错误检测工具Address Sanitizer(ASan)
Address Sanitizer(ASan)是一个快速的内存错误检测工具。从gcc 4.8开始,AddressSanitizer成为gcc的一部分。既然是gcc内置的内存检查工具,用起来比第三方的库更方便些。上述示例中:代码的含义是使用cmake generator-expression(生成器表达式)指定只在编译器为gcc,且操作系统为Linux时增加编译选项同理,也是在编译器为gcc,且操作系统为Linux时增加链接选项。原创 2024-09-02 13:07:12 · 785 阅读 · 0 评论 -
通过升级cmake版本解决NDK编译报错:no member named ‘signbit‘ in the global namespace;
今天在ubuntu16下使用NDK(r19)编译thrift c++库时报了很多类似如下的错误:/android-ndk-r19c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/c++/v1/cmath:314:9: error:no member named ‘signbit’ in the global namespace; did you mean‘__signbit’?using ::signbit;~~^/usr/原创 2020-12-04 12:50:44 · 4372 阅读 · 1 评论 -
cmake:target属性POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE的区别
cmake定义的target有两个名字类似的属性:`POSITION_INDEPENDENT_CODE`和`INTERFACE_POSITION_INDEPENDENT_CODE`,本文说明它们的含义和区别原创 2023-09-21 12:04:11 · 716 阅读 · 4 评论 -
cmake:arm-xm-linux交叉编译工具链文件及交叉支持HTTPS的curl静态库
curl是一个成熟的HTTP client库,现在windows平台下可以使用cmake在命令行完成编译。TOOLCHAIN首先要准备工具链文件arm-xm-linux-uclibcgnueabi.toolchain.cmake# This one is importantSET(CMAKE_SYSTEM_NAME Linux)SET(CMAKE_SYSTEM_PROCESSOR arm)# _compiler_prefix 定义编译器安装位置 set(_compiler_prefix /原创 2022-03-28 17:39:01 · 1961 阅读 · 0 评论 -
cmake: MinGW编译时为httplib.h增加连接库支持
httplib.h是一个只有一个头文件的C++11语言的跨平台 HTTP/HTTPS 库。如果使用在自己的项目中,在MinGW下编译时,会报连接错误,因为找不到socket相关库。所以在连接时需要参照httplib.h中对MSVC的库依赖,添加ws2_32,crypt32,cryptui几个库的#ifdef _MSC_VER#pragma comment(lib, "ws2_32.lib")#pragma comment(lib, "crypt32.lib")#pragma comment(li原创 2022-03-27 16:53:06 · 1202 阅读 · 0 评论 -
cmake:cpp_redis的find_package脚本 FindCppRedis.cmake
cpp_redis是个C++11的开源的redis client库,支持cmake构建,但并没有提供CONFIG模式的import target导入脚本,如果希望在cmake下以find_package方式导入cpp_redis的库,就需要自己写一个MODULE模式脚本,以下为FindCppRedis.cmake脚本实现FindCppRedis.cmake# FindCppRedis# --------## Find cpp_redis## Find the native cpp_redis原创 2022-03-19 10:08:36 · 760 阅读 · 0 评论 -
conan入门(十九):封装第三方开源库cpp_redis示例
conan: 封装第三方开源库cpp_redis示例在我的之前关于conan系列博客中,已经介绍过如何引用Conan中央仓库(conan-center)预定义的第三库(《conan入门(五):conan 交叉编译引用第三方库示例》),以及如何将自己的项目封装为Conan包以供第三方引用(《conan入门(七):将自己的项目生成conan包》)。但是这个世界实际是复杂的,虽然Conan中央仓库已经收录了上千个常用的开源第三方库,但仍然有更多的第三库并没被Conan中央仓库收录,你不能指望你所需要的任何第三原创 2022-03-15 15:11:00 · 2587 阅读 · 2 评论 -
cmake:通过CMAKE_CXX_COMPILE_FEATURES判断编译器是否支持C++11
以前在cmake中要判断一个编译器是否支持C++11挺麻烦的,要根据编译器的类型和版本来判断。从cmake 3.1版本开始增加了一个CMAKE_CXX_COMPILE_FEATURES变量用于获取当前C++ 编译器支持的编译特性列表,列表中是一些定义在CMAKE_CXX_KNOWN_FEATURES(C++已知特性)中的特性名字,比如cxx_lambdas即为当前编译器支持lambda表达式。从cmake 3.8版本开始,cmake可识别的编译特性增加了代表C++标准的特性名:cxx_std_98,cx原创 2022-03-03 15:13:33 · 2882 阅读 · 0 评论 -
conan入门(九):NDK交叉编译自己的conan包项目塈profile的定义
上一篇博客《conan入门(八):交叉编译自己的conan包项目》中我们以jsonlib为例说明了如何将交叉编译自己封装成conan的模块。但是使用的DS-5 ARM的交叉编译器(`arm-linux-gnueabihf`)并不常见,也不方便读者实际操作。本文还以 jsonlib 为例,说明如何将自己的封装成conan的模块使用Android NDK实现交叉编译。原创 2022-02-20 11:54:29 · 1875 阅读 · 0 评论 -
conan入门(八):交叉编译自己的conan包项目
上一篇博客《conan入门(七):将自己的项目生成conan包》中我们以jsonlib为例说明了如何将自己的模块封装成conan提供给第三方使用。那是比较简单的一种编译本机目标代码的应用场景。在使用conan来管理C/C++包(制品库)的环境下,如何实现对conan包封装的项目实现交叉编译的支持呢?因为我的工作涉及不少嵌入式平台的开发,conan对交叉编译的支持是我最关心的部分。本文还以 jsonlib 为例,说明如何将自己的封装成conan的模块实现交叉编译。原创 2022-02-19 14:38:06 · 2848 阅读 · 4 评论 -
conan入门(七):将自己的项目生成conan包
conan 将自己的项目生成conan包Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、Android)和裸机。它还与 CMake、Visual Studio (MSBuild)、Makefiles、SCons 等所有构建系统集成,包括专有系统。它专为加速 C 和 C++ 项目的开发和持续集成而设计和优化。通过完整的二进制包管理,它可以为任原创 2022-02-19 12:18:44 · 6492 阅读 · 4 评论 -
conan入门(五):conan 交叉编译引用第三方库示例
conan 交叉编译引用第三方库示例Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、Android)和裸机。它还与 CMake、Visual Studio (MSBuild)、Makefiles、SCons 等所有构建系统集成,包括专有系统。它专为加速 C 和 C++ 项目的开发和持续集成而设计和优化。通过完整的二进制包管理,它可以为任原创 2022-02-17 17:57:23 · 4323 阅读 · 0 评论 -
conan入门(四):conan 引用第三方库示例
conan 引用第三方库示例Conan 是 C 和 C++ 语言的依赖项和包管理器。它是免费和开源的,适用于所有平台(Windows、Linux、OSX、FreeBSD、Solaris 等),可用于开发所有目标,包括嵌入式、移动(iOS、Android)和裸机。它还与 CMake、Visual Studio (MSBuild)、Makefiles、SCons 等所有构建系统集成,包括专有系统。它专为加速 C 和 C++ 项目的开发和持续集成而设计和优化。通过完整的二进制包管理,它可以为任意数量的不原创 2022-02-17 17:51:00 · 9965 阅读 · 7 评论 -
conan入门(一):conan 及 JFrog Artifactory 安装
conan 安装Conan是一个面向 C 和 C++ 开发人员的软件包管理器。Conan是通用且便携的。它适用于所有操作系统,包括 Windows、Linux、OSX、FreeBSD、Solaris 等,并且可以针对任何平台,包括桌面、服务器以及嵌入式和裸机设备的交叉构建。它与 Docker、MinGW、WSL 等其他工具以及 CMake、MSBuild、Makefiles、Meson、SCons 等所有构建系统集成。它甚至可以与任何专有的构建系统集成。Conan 是完全免费和开源的,并且完全去中心化原创 2022-02-17 17:06:59 · 15086 阅读 · 17 评论 -
verrelcm:cmake项目版本发布脚本工具
最近经常设计C/C++的中间件,版本稳定了就要在git上打个标签(tag),修改CMakeLists.txt中的版本号,还要更新头文件中定义的版本号。更新一个版本号,需要修改两个地方,还要执行git几个命令,一统操作下要花几分钟,搞不好还会出错,要是漏掉点啥也不一定,毕竟手工操作嘛。我做Java项目的时候,这都不是问题,因为maven的release插件可以自动帮我完成上面的所有操作,我只需要指定版本号就成了。于是我就写了这个verrelcm.sh脚本verrelcmverrelcm.sh(http原创 2022-02-12 17:32:49 · 556 阅读 · 0 评论 -
cmake:ESP32交叉编译工具链定义
ESP32的SDK(ESP-IDF)本身提供了esp32平台的cmake toolchain文件:esp-idf-v4.4\tools\cmake\toolchain-esp32.cmake 1就是esp32的工具链文件定义样板。如下:set(CMAKE_SYSTEM_NAME Generic)set(CMAKE_C_COMPILER xtensa-esp32-elf-gcc)set(CMAKE_CXX_COMPILER xtensa-esp32-elf-g++)set(CMAKE_ASM_CO原创 2022-02-12 10:54:24 · 5405 阅读 · 0 评论 -
cmake:Windows编译支持HTTPS的curl库及find_package查找CURL时需要注意的问题
curl是一个成熟的HTTP client库,现在windows平台下可以使用cmake在命令行完成编译。build curl以下脚本实现Windows CMD下使用cmake及VS2015编译curlcd curlmkdir buildcd build# 生成Visual Studio 2015工程文件cmake .. -G "Visual Studio 14 2015 Win64" ^ -DCMAKE_INSTALL_PREFIX=J:\curl-vc140-x64 ^ -DBUILD原创 2022-02-07 18:01:34 · 5062 阅读 · 0 评论 -
cmake:基于MDK(Keil)的Nationstech.N32G45x平台交叉编译工具链定义
Keil MDK是非常常用的单片机开发集成环境,Keil公司2005年由ARM公司收购,现在是ARM主要的嵌入系统开发平台(ARM的另一个开发环境ds-5早在九年前就停止更新了)。Keil虽然是个集成开发环境,但Keil本身其实是由μVision IDE和arm编译器构成。cmake虽然目前不支持生成μVision的工程文件,但cmake完全可以使用MDK中提供的arm编译器来实现独立于μVision的交叉编译(说到底μVision只是一个为开发者提供易用的GUI界面,真正干活的还是编译器)。cmake原创 2022-02-06 15:36:07 · 2173 阅读 · 0 评论 -
cmake/ASR1603:交叉编译工具链定义
在ASR1603 4G模块平台上用cmake交叉编译要求安装DS-5编译器(DS500-BN-00022-r5p0-26rel0.zip)及ASD1603 SDK(asr1603_opencpu_sdk-2022-01-13.zip)(参见ASR1603相关的技术手册)。并如下设置环境变量:setenv.bat@rem ------------------------------------------------------------@rem (C) Copyright [2006-2008]原创 2022-01-26 13:31:39 · 2119 阅读 · 0 评论 -
cmake:解决MSVC下/MT 编译paho.mqtt.c的问题
paho.mqtt.c是eclipse开发的C语言跨平台mqtt client 开源库,之前写过一篇博客《cmake:VS2015和GCC编译paho.mqtt C/C++ client》介绍如何编译它。最近在使用的时候发现有个问题:paho.mqtt.c在MSVC编译的时候不能支持/MT编译。compiler_flag_overrides.cmake为了以/MT编译paho.mqtt.c,在不修改paho.mqtt.c项目代码的情况需要使用CMAKE_USER_MAKE_RULES_OVERRIDE原创 2022-01-06 11:41:49 · 1667 阅读 · 0 评论 -
cmake:MSVC,GNU解决bigobj问题
当代码中使用了大量模板时,会导致编译出的OBJ文件巨大,编译器会报错,在MSVC下错误为 Fatal Error C1128在GNU C++下错误提示为 too many sections…File too big解决办法也不复杂:在MSVC下要添加编译选项 /bigobj在GNU C++下要添加编译选项 -Wa,-mbig-obj在cmake脚本中,可以使用cmake-generator-expressions以如下的简洁方式设置MSVC和GNU的编译选项:add_executable(it原创 2021-11-12 15:48:02 · 5895 阅读 · 0 评论 -
cmake:VS2015和GCC编译paho.mqtt C/C++ client
paho.mqtt.c是eclipse开发的C语言跨平台mqtt client 开源库,paho.mqtt.cpp是对应的C++ Client,paho.mqtt支持CMAKE编译,本文以脚本形式提供了使用CMAKE基于VS2015/Windows以及GCC/MinGW的编译过程。环境要求cmake 这是必须的编译工具Visual Studio 2015 OR MinGW for windowsgcc for linuxVisual Studio 2015 编译脚本msvc_build.bat原创 2021-11-10 11:41:42 · 1537 阅读 · 0 评论 -
cmake:VS2015和GCC编译cpp_redis
cpp_redis是一个基于C++11编写的支持跨平台的redis客户端。使用起来很方便,cpp_redis支持CMAKE编译,编译也很简单,本文以脚本形式提供了使用CMAKE基于VS2015/Windows以及GCC/MinGW的编译过程。环境要求cmake 这是必须的编译工具Visual Studio 2015 OR MinGW for windowsgcc for linuxVisual Studio 2015 编译脚本msvc_build.bat要求cpp_redis源码文件夹与ms原创 2021-11-09 17:10:26 · 1059 阅读 · 0 评论 -
cmake编译cJSON,使用时找不到cjson-static target(静态库) 的问题
cJSON是基于ANSI C的跨平台JSON解析开源库,支持cmake跨平台编译.使用cmake也不复杂,以gcc编译为例以下是编译过程。build cJSON# 从github下载cJSON代码git clone https://github.com/DaveGamble/cJSON.gitcd cJSON# 当前文件夹下生成编译工程文件# BUILD_SHARED_AND_STATIC_LIBS=ON 指定生成静态库和动态库,默认只生成动态库cmake . -G "Unix Makefi原创 2021-11-09 12:34:55 · 1403 阅读 · 0 评论 -
cmake:VS2015和GCC编译cJSON
cJSON是基于ANSI C的跨平台JSON解析开源库,在嵌入式应用中使用比较广泛, cJSON支持CMAKE编译,本文以脚本形式提供了使用CMAKE基于VS2015/Windows以及GCC/MinGW的编译过程。环境要求cmake 这是必须的编译工具Visual Studio 2015 OR MinGW for windowsgcc for linuxVisual Studio 2015 编译脚本msvc_build.bat要求cJSON源码文件夹与msvc_build.bat脚本在同一原创 2021-11-09 11:01:47 · 716 阅读 · 0 评论 -
cmake: CHECK_INCLUDE_FILE_CXX 检查是否存在 codecvt 头文件
今天第一次使用cmake的CHECK_INCLUDE_FILE_CXX 函数检查是否存在 codecvt include文件,然而出错了(编译器使用gcc 5.4.0)。cmake脚本如下:include(CheckIncludeFileCXX)# 检查是否存在 codecvt header fileCHECK_INCLUDE_FILE_CXX(codecvt HAS_CODECVT )# 检查是否存在 algorithm header fileCHECK_INCLUDE_FILE_CXX(al原创 2021-06-01 15:42:32 · 3593 阅读 · 0 评论 -
windows下Android NDK R19 交叉编译 thrift C++ 库(cmake)
在NDK下编译thrift C++库,先要要编译android版的boost,这个不是本文讨论的内容,关于编译android 版本的boost,参见这个开源项目 Boost-for-Android,很好用。我用Boost-for-Androidk顺利编译了boost 1.69.(Android NDK r19)有了android版的boost就可以编译thrift C++库了。在这里走了不少弯路。先说明一下我的编译环境:操作系统:Windows 7cmake 3.11.1,编译thrift需要cm原创 2020-12-03 18:07:46 · 1215 阅读 · 0 评论 -
cmake:pkg_check_modules(FindPkgConfig)的新特性IMPORTED_TARGET
pkg-config提供了一个统一的接口查询安装库的编译相关信息。它允许程序员和安装脚本工作没有明确详细的库路径信息。和cmake相比,pkg-config是另一个独立的历史更悠久的library信息描述体系,cmake的FindPkgConfig Module的作用是调用pkg-config查找pkg-config格式的库信息.cmake 3.6版本以后用于查找pkg-config格式安装包...原创 2018-10-12 15:56:02 · 8831 阅读 · 1 评论 -
cmake:macro,function中ARGV,ARGN参数的区别
cmake中的宏(macro)和函数(function)都支持动态参数变量ARGC记录传入的参数个数变量ARGV0,ARGV1,...顺序代表传入的参数变量ARGV则是一个包含所有传入参数的list变量ARGN也是一个包含传入参数的list,但不是所有参数,而是指macro/function声明的参数之后的所有传入参数写一个小程序就可以验证:# 定义一个宏,显式声明了两个参数hello...原创 2018-10-12 15:25:38 · 6556 阅读 · 1 评论 -
cmake:使用find_package查找libjpeg的静态库
我们知道简单的使用命令find_package可以查找指定的package.对于经常会用到的 jpeg库turbojpeg,可以用find_package(JPEG REQUIRED)来查找。find_package(JPEG REQUIRED)if(JPEG_FOUND) message(STATUS "JPEG_INCLUDE_DIR=${JPEG_INCLUDE_DIR}") me...原创 2018-10-03 15:35:28 · 5289 阅读 · 1 评论 -
cmake:LINK : error LNK2001: 无法解析的外部符号 WinMainCRTStartup
正在设计的一个C/C++混合语言项目是用cmake来管理编译的,用cmake生成的一个Visual Studio工程(c++)在编译时报了个错: LINK : error LNK2001: 无法解析的外部符号 WinMainCRTStartup好是莫名其妙的问题,之前是没有这个问题的,反复查看了GIT提交记录,发现问题出在cmake脚本中 原本项目的定义是这样的,语言指定C,CXX...原创 2018-09-11 22:18:50 · 5969 阅读 · 0 评论 -
cmake error: includes target which requires target that is not in the export set,解决静态库的PRIVATE依赖导出问题
问题描述最近在使用 interface libraries时出了个小问题。 示例如下,我希望target not_exported只是作为fse_cas_static 的private类的依赖库内部使用,不希望在config file中导出对它的依赖。# 创建静态库add_library(fse_cas_static STATIC ${_SOURCE_FILES})# 创建inter...原创 2018-04-29 14:18:12 · 4596 阅读 · 1 评论 -
cmake:eclipse和ultraedit对CMakeLists.txt的语法高亮支持
关于编辑器对cmake的脚本的支持,参见:https://cmake.org/Wiki/CMake_Editors_Support 列出了各类编辑器对cmake脚本的支持。对于eclipse我使用CMakeEd,我的eclipse版本是lunna,在线安装不成功(https://marketplace.eclipse.org/content/cmake-editor)。 改为从这里下载安装包(ht原创 2016-08-30 13:33:41 · 2592 阅读 · 1 评论 -
cmake:FindLIBCONFIG.cmake查找libconfig的脚本find_package脚本
libconfig 是一个用于读取,操作和编写结构化配置文件的库。cmake并没有为libconfig提供find_package脚本。所以自己撸一个,实现跨平台的查找libconfig库FindLIBCONFIG.cmake# - Find libconfig# - This module determines the libconfig library of the system# T...原创 2018-10-14 15:55:18 · 1025 阅读 · 3 评论 -
cmake:find_package查找pthread for win32的实现脚本
pthread for win32本身没有提供find_package脚本,cmake官方也没有提供,所以如果在cmake中要查找pthread for win32的库,就得自己实现,我参照FindJPEG.cmake自己写了个查找脚本FindPTHREADW32。cmake官方提供的FindJPEG.cmake非常简单,只输出了include文件夹位置和JPEG库文件(JPEG_INCLUDE...原创 2018-10-09 00:05:41 · 1453 阅读 · 1 评论 -
cmake:解决error LNK2005: void * __cdecl operator new(unsigned __int64) already defined in LIBCMTD.lib
当以/MT选项编译MFC项目时,会报下面的错误1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned __int64)" (??2@YAPEAX_K@Z) 已经在 LIBCMTD.lib(new_scalar.obj) 中定义1>nafxcwd.lib(原创 2018-10-10 16:34:04 · 12295 阅读 · 0 评论 -
cmake-gui:创建可选列表ComboBoxes
就像一般的程序设计一样,在设计cmake脚本时有时我们希望一个变量的值限定在一个范围内。如下图,cmake-gui中用户可以选择输出日志的级别,肯定我们不希望用户乱输一气。这时就要用到CACHE 的属性STRINGS# 日志输出级别set(LOG_LEVEL FL_LOG_DEBUG CACHE STRING "application log level")# 设置CACHE 的属性ST...原创 2018-10-22 11:19:10 · 691 阅读 · 1 评论 -
cmake:CMAKE_SYSTEM_PROCESSOR为空是怎么回事儿?
今天执行cmake创建Makefile的时候出了个怪事:CMAKE_SYSTEM_PROCESSOR的值为空反复测试到到了原因:我在执行cmake时加了参数-DCMAKE_SYSTEM_NAME=Linuxcmake . -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_SYSTEM_NAME=Linux根据cmake官方关于交叉编译的介绍: 《Cr...原创 2018-10-17 11:15:29 · 6599 阅读 · 0 评论 -
cmake/gcc:strip缩减程序体积
方法1cmake生成的Makefile中有一个target名为intall/strip可以将install的可执行程序执行strip,执行make help,就可以看到$ make helpThe following are some of the valid targets for this Makefile:... all (the default if no target is pr...原创 2018-10-20 14:14:48 · 12492 阅读 · 1 评论 -
cmake:gperftools性能分析工具find libprofiler 脚本暨profiler的静态连接问题
gperftools是一个很好用的性能分析工具,但没有提供官方的用于查找profiler库的cmake脚本,所以在基于cmake管理的项目中如果要在系统查找libprofiler库就就要自己写FindPROFILER.cmake脚本。将脚本所在的文件夹加入CMAKE_MODULE_PATH,调用find_package(PROFILER),就会找到系统中安装的gperftools的libprof...原创 2018-11-07 00:40:07 · 3580 阅读 · 1 评论