ccache and distcc

本文详细介绍了ccache的基本原理、安装与使用方法,以及如何与distcc协同工作以显著提升开发环境性能。通过优化编译过程,减少重复解析头文件的浪费,ccache能大幅加快编译速度。而distcc则进一步通过分布式编译加速同步编译过程,尤其适用于大型工程。结合两者,开发者能在复杂项目中显著缩短开发周期。

  好久没有写总结了,陌生了这博客,也陌生了文字,只觉得工作后的人生就再也不只是生活了!现在的我,在为生活而工作与为工作而生活的纠结中,几乎快要迷失了自我,偶尔偷闲,写点东西,歇歇脚,明天继续赶路。。。。。。

 

ccache的主页:http://ccache.samba.org

distcc的主页:http://distcc.samba.org

 

1、背景:

在处理一些规模相对较大的工程时,编译花费的时间可能会很长。有时候我们会经常一遍一遍地编译相同的程序,此时,有了ccache情况就好多了。它将在第一遍编译时多花几秒钟,但接下来就会使编译成倍(5-10倍)的提速。

ccache 的基本原理是通过将头文件高速缓存到源文件之中而改进了构建性能,因而通过减少每一步编译时添加头文件所需要的时间而提高了构建速度。以下来了解下如何同时使用 ccache distcc 来使开发环境达到最佳性能。

 

2、引入ccache

在标准的编译过程中,在 UNIX 下使用 C/C++ 开发应用程序通常需要用到一个编译器(如 gcc)以及一个编译工具(如 make)。make 和所有的 C 编译器的问题在于 C 预处理程序(preprocessor)和头文件的工作方式。观察一个典型的 C 源文件,您会发现其中有很多由 #include 所引用的各种头文件。每一次编译一个文件时,预处理程序(cpp)都会解析并引入每个头文件以及这些头文件引用到的任何文件。通过对内容进行解析,cpp 可以将一个相当基本的 1-KB 大小的源文件转化为一个 8-KB 大小的源文件,在这个过程中,会合并入几十个甚至几百个头文件。在典型的开发项目中,有很多与项目相关的头文件可能会在不同的源文件中多次被引入,而且每个头文件本身也可能引用很多其他头文件。这就是我们使用了N年的C编译器的基本编译理念,从C出现到如今,它带给人们无数编译成果的同时,也逐渐暴露出自身固有的缺憾。

在典型的编译过程中,make 工具只编译自上次编译后发生修改的文件,这样就在很大程度上简化了编译过程。make 将必须被编译的文件限制在经过修改的那些源文件范围之内,但是即使是使用 make,仍然有相当的浪费。每一次编译项目时,源文件在编译为汇编语言和最终的机器代码之前,都要通过 cpp 进行解析。对每一个文件来说,每一次可能都要重新解析头文件,由此上面提到的问题再次出现。从编译的全过程来看,您最后可能多次解析了相同的头文件,浪费了处理器周期,更浪费了开发时间。

 

3 ccache基本原理:

ccache“compiler cache”的缩写)也是一个编译器驱动器。第一趟编译时ccache缓存了GCC的“-E”输出、编译选项以及.o文件到$HOME/.ccache。第二次编译时尽量利用缓存,必要时更新缓存。所以即使"make clean; make"也能从中获得好处。ccache是经过仔细编写的,确保了与直接使用GCC获得完全相同的输出。

ccache工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息,比如头文件,这样就节省了通常使用 cpp 解析这些信息所需要的时间。举例编译Example,假定 foobar.h 中包含对其他头文件的引用,ccache 会用那个文件的 cpp-parsed 版本(已编译过并被ccache缓存在cache中的备份)来取代 include 声明,而不是真正去读取、理解并解释其内容,ccache 只是将缓存在高速缓存中最终的文本拷贝到文件中,使得它可以立即被编译。 

Example

#include "foobar.h" 

void main(void) 

{ 

} 

 

4、安装

安装和使用 ccache很简单。首先说明一点,ccache它不会取代或者以任何方式影响您原来的使用编译器的方式,而是担当了您与您的编译器之间的一个接口,所以您可以根据需要选择是否使用它。要安装 ccache,需要从 Samba 小组或者一个本地镜像直接下载源文件。解压出文件的内容: 

 

1)、单机安装方法:

首先解压:

bunzip2 -c ccache-2.3.tar.bz2|tar xf -

切换到那个目录:

$ cd ccache-3.18

配置:

$ ./configure

编译:

$ make

最后,安装 ccache

$ make install

 

2)、若情况为多人共用服务器,自己只是服务器的一个普通用户,除非你拥有root权限,或者root允许使用sudo,否则要安装到用户目录下,这时步骤如下:

$ cd ccache-3.18

配置:

$ ./configure –prefix=~/My_Software/ccache/

【若提示configure: error: expected an absolute directory name for --prefix: ~/My_Software/ccache,则需要指定绝对路径,即改成/home/用户名/My_Software/ccache/

编译:

$ make

最后,安装 ccache

$ make install

 

3)、也可以使用Linuxyum安装:

A、切换到root用户安装ccache

yum install ccache

 

B、查看已安装的rpm -qa | grep ccache

ccache-2.4-1.2.el4.rf

 

Crpm -ql ccache

 

至此,安装完成,接下来就准备好开始使用了!

 

 

5、使用ccache

前面提到,ccache 是充当您与您的普通编译器之间一个借口来优化编译的。有两种方式使用ccache

1)、选择性使用ccache

使用"ccache gcc""ccache g++"代替"gcc""g++" ,以 gcc 为第一个参数调用 ccache,而不是调用 gcc。例如,要在命令行中编译一个文件,您通常会使用:

$ gcc foo.c

要使用 ccache,您应该输入:

$ ccache gcc foo.c

像这样对一个文件进行单独的编译,尤其是第一次使用 ccache 编译那个文件时,您将不会看到有任何的帮助,因为编译信息还没有被高速缓存。

 

2)、ccache加入环境变量,取代C编译器:

设置 CC 环境变量的值,配置makepkg,进入到你的/etc/makepkg.conf中加入下面几行:

export CC="ccache gcc"

export CPP="ccache cpp"

export CXX="ccache g++"

 

或者直接在命令行输入:

export set CC='ccache gcc'

 

makepkg.conf里还有不少东西可以修改,详情参见原文:

http://wiki.archlinux.org/index.php/Makepkg.conf

 

    3)、配置 ccache 永久地取代主要编译器:

vi ~/.bash_profile

/usr/lib/ccache/bin路径加到PATH

PATH=/usr/lib/ccache/bin:$PATH

这只是对ccache所自带的gcc起作用,有时候我们需要使用交叉编译工具,这时,仅仅通过以上操作是无法执行ccache编译的,通常会提示xxx路径没有这个编译工具,这时需要这样做:

A$ which ccache

查看安装路径, /home/用户名/ccache

B$ mkdir ~/.bin

C$ cd ~/.bin/

   $ ln -s /usr/bin/ccache gcc

   $ ln -s /usr/bin/ccache g++

   $ ln -s /usr/bin/ccache arm-linux-gcc

   $ ln -s /usr/bin/ccache arm-linux-g++

同理,其他编译工具类似方式指定。

 

DPATH设置,将~/.bin/放在 arm-linux-gcc等的PATH的前面。

如:原:PATH=$PATH:$HOME/bin

现:PATH=/home/用户名/.bin:$PATH:/home/用户名/ccache/bin

然后重启即可

 

E$ which arm-linux-gcc

/home/<user>/.bin/arm-linux-gcc 确认

这样每次启动g++的时候都会启动/usr/lib/ccache/bin/g++,而不会启动/usr/bin/g++,效果跟使用命令行ccache g++效果一样。每次用户登录时,使用g++编译器时会自动启动ccache

 

如果您只是想为一个项目启用 ccache,比如说编译 Perl 等第三方工具时,那么您或者可以使用第二种方式,或者可以告知配置脚本或 make 命令使用哪个 C 编译器。

 

 

6、控制高速缓存

 

默认情况下,ccache 使用当前用户主目录中的一个目录($HOME/.ccache)来保持高速缓存信息。在团队环境中,您应该使用一个集中的位置来进行高速缓存,这样在编译过程中每个人都可以使用高速缓存的信息。另一个环境变量 CCACHE_DIR 指定了高速缓存目录的位置。在单机环境中,将这个环境变量设置为一个每一个需要它的人都可以访问的目录。使用通过 tmpfs 挂载的目录可以获得更高的速度,前提是您得有支持这一功能的存储器。您的速度可能会再提高 10%  25%。 

 

如果您是在网络中多台机器上使用 ccache(分布式编译),那么要确保您共享的目录要通过 NFS 导出(export)并挂载到每一个客户机上。如果您希望获得额外的加速,同样可以使用 tmpfs 文件系统。

 

另外的一些选项让您可以更深入地控制高速缓存设置: 

 

CCACHE_LOGFILE :定义了使用高速缓存时生成的日志文件所处的位置。 

 

 ccache 中使用 -s 命令行选项来获得关于高速缓存性能的统计数据。 

 

使用 -M 命令行选项来设置高速缓存的最大大小。默认是 1GB。高速缓存的设置会写入到高速缓存目录,所以您可以让不同的用户和组在不同的位置拥有不同大小的高速缓存。 

 

-F 选项设置高速缓存目录的最大文件数目,按 16 进制舍入。和 -M 相同,只是当您希望改变配置的时候才需要使用它。 

 

-c 选项清空缓存。您通常不需要使用这个选项,因为 ccache 在执行过程中会更新信息,但是,如果您要重用一个没有为某个文件所使用的高速缓存目录,那么就应该尝试使用这个选项。 

 

-C 选项完全清空高速缓存。 

 

一旦设置了初始化选项并配置了期望的目录和高速缓存大小,就不需要再做任何改动。没有必要执行任何日常的维护。

 

 

7、组合 ccache  distcc

 

您可能已经想到了 distcc 这一来自 Samba 小组的另一个工具,它让您可以将编译过程分布到多台机器上。只需要为 make 添加多任务选项(使用 -j 命令行选项),它就可以有效地提高同步编译的数目。distcc 系统的工作方式是,每台主机上有一个后台进程,接收最终预解析格式的源文件,然后在本地进行编译,返回生成的对象文件。

如果使用得当,在每加入一个新的同样节点时,编译时间通常应该会以稍微低于线性的比率下降,不过您将只会在那些远不只一个源文件的项目上看到这样的影响,因为 distcc 只是分布全部源文件。

由于 distcc 所分布的是解析过的文件,所以您可以组合 ccache,它可以加速 C 预处理过程部分,同时distcc 可以完成到对象代码的实际编译。要以这种方式来使用 distcc  ccache,需要在主机上配置 distcc,在主要的开发机器上配置 distcc  ccache

现在在希望要编译项目的机器上设置环境变量,如下所示。

使用 ccache  distcc 所需要的环境变量:

 

export  set  DISTCC_HOSTS='localhost atuin nautilus pteppic kernel'

export set CCACHE_DIR=/Data/Cache/CCache 

export set CCACHE_PREFIX=distcc 

export set CCACHE_LOGFILE=/Data/Cache/CCache.log 

export set CC='ccache gcc' 

 

环境变量定义如下: 

 

DISTCC_HOSTS 指定了将工作分布到哪些主机。 

CCACHE_DIR 指定了高速缓存目录的位置。 

CCACHE_PREFIX 定义了当 ccache 调用真实的编译器来编译源文件(预处理之后)时所使用的前缀。 

CC 设置首先使用的 C 编译器的名称(ccache)。 

 

现在,当运行 make 时,如果使用了 -j 选项来指定要执行的同步编译的数目,则首先使用 ccache 解析文件(如果需要,使用高速缓存),然后将其分布到某个 distcc 主机。 

 

尽管 distcc 加速了编译过程,但是它没有改变环境的基本限制。例如,您不应该将 make 执行的同步作业的数目设置得大于可用 CPU 数目的两倍。例如,如果您有四台两路机器,那么将作业值设置为超过 16 的值时将不再会观察到有多大改善。

 

 

好了,强大的ccache至此已经基本了解了,想要更深入的理解还是在使用实践中获得吧。以上这些都是借鉴网上众前人帖子而总结出的一点经验,实际操作使用时没必要这么深入,就当他是一个小工具就可以了,会用即可。贴出来梳理下思路,以便对后来人有些帮助!

dell@dell-Precision-3660:~/catkin_ws$ source ~/.bashrc dell@dell-Precision-3660:~/catkin_ws$ catkin config --help usage: catkin config [-h] [--workspace WORKSPACE] [--profile PROFILE] [--append-args | --remove-args] [--init] [--extend EXTEND_PATH | --no-extend] [--mkdirs] [--authors NAME [EMAIL ...] | --maintainers NAME [EMAIL ...] | --licenses LICENSE [LICENSE ...]] [--buildlist PKG [PKG ...] | --no-buildlist] [--skiplist PKG [PKG ...] | --no-skiplist] [--build-space BUILD_SPACE | --default-build-space] [--devel-space DEVEL_SPACE | --default-devel-space] [--install-space INSTALL_SPACE | --default-install-space] [--log-space LOG_SPACE | --default-log-space] [--source-space SOURCE_SPACE | --default-source-space] [-x SPACE_SUFFIX] [--link-devel | --merge-devel | --isolate-devel] [--install | --no-install] [--isolate-install | --merge-install] [-j JOBS] [-p PACKAGE_JOBS] [-l LOAD_AVERAGE] [--jobserver | --no-jobserver] [--env-cache | --no-env-cache] [--cmake-args ARG [ARG ...] | --no-cmake-args] [--make-args ARG [ARG ...] | --no-make-args] [--catkin-make-args ARG [ARG ...] | --no-catkin-make-args] This verb is used to configure a catkin workspace's configuration and layout. Calling `catkin config` with no arguments will display the current config and affect no changes if a config already exists for the current workspace and profile. options: -h, --help show this help message and exit --workspace WORKSPACE, -w WORKSPACE The path to the catkin_tools workspace or a directory contained within it (default: ".") --profile PROFILE The name of a config profile to use (default: active profile) Behavior: Options affecting argument handling. --append-args, -a For list-type arguments, append elements. --remove-args, -r For list-type arguments, remove elements. Workspace Context: Options affecting the context of the workspace. --init Initialize a workspace if it does not yet exist. --extend EXTEND_PATH, -e EXTEND_PATH Explicitly extend the result-space of another catkin workspace, overriding the value of $CMAKE_PREFIX_PATH. --no-extend Un-set the explicit extension of another workspace as set by --extend. --mkdirs Create directories required by the configuration (e.g. source space) if they do not already exist. Package Create Defaults: Information of default authors/maintainers of created packages --authors NAME [EMAIL ...] Set the default authors of created packages --maintainers NAME [EMAIL ...] Set the default maintainers of created packages --licenses LICENSE [LICENSE ...] Set the default licenses of created packages Package Build Defaults: Packages to include or exclude from default build behavior. --buildlist PKG [PKG ...] Set the packages on the buildlist. If the buildlist is non-empty, only the packages on the buildlist are built with a bare call to `catkin build`. --no-buildlist Clear all packages from the buildlist. --skiplist PKG [PKG ...] Set the packages on the skiplist. Packages on the skiplist are not built with a bare call to `catkin build`. --no-skiplist Clear all packages from the skiplist. Spaces: Location of parts of the catkin workspace. --build-space BUILD_SPACE, -b BUILD_SPACE The path to the build space. --default-build-space Use the default path to the build space ("build") --devel-space DEVEL_SPACE, -d DEVEL_SPACE The path to the devel space. --default-devel-space Use the default path to the devel space ("devel") --install-space INSTALL_SPACE, -i INSTALL_SPACE The path to the install space. --default-install-space Use the default path to the install space ("install") --log-space LOG_SPACE, -L LOG_SPACE The path to the log space. --default-log-space Use the default path to the log space ("logs") --source-space SOURCE_SPACE, -s SOURCE_SPACE The path to the source space. --default-source-space Use the default path to the source space ("src") -x SPACE_SUFFIX, --space-suffix SPACE_SUFFIX Suffix for build, devel, and install space if they are not otherwise explicitly set. Devel Space: Options for configuring the structure of the devel space. --link-devel Build products from each catkin package into isolated spaces, then symbolically link them into a merged devel space. --merge-devel Build products from each catkin package into a single merged devel spaces. --isolate-devel Build products from each catkin package into isolated devel spaces. Install Space: Options for configuring the structure of the install space. --install Causes each package to be installed to the install space. --no-install Disables installing each package into the install space. --isolate-install Install each catkin package into a separate install space. --merge-install Install each catkin package into a single merged install space. Build Options: Options for configuring the way packages are built. -j JOBS, --jobs JOBS Maximum number of build jobs to be distributed across active packages. (default is cpu count) -p PACKAGE_JOBS, --parallel-packages PACKAGE_JOBS Maximum number of packages allowed to be built in parallel (default is cpu count) -l LOAD_AVERAGE, --load-average LOAD_AVERAGE Maximum load average before no new build jobs are scheduled --jobserver Use the internal GNU Make job server which will limit the number of Make jobs across all active packages. --no-jobserver Disable the internal GNU Make job server, and use an external one (like distcc, for example). --env-cache Re-use cached environment variables when re-sourcing a resultspace that has been loaded at a different stage in the task. --no-env-cache Don't cache environment variables when re-sourcing the same resultspace. --cmake-args ARG [ARG ...] Arbitrary arguments which are passed to CMake. It collects all of following arguments until a "--" is read. --no-cmake-args Pass no additional arguments to CMake. --make-args ARG [ARG ...] Arbitrary arguments which are passed to make. It collects all of following arguments until a "--" is read. --no-make-args Pass no additional arguments to make (does not affect --catkin-make-args). --catkin-make-args ARG [ARG ...] Arbitrary arguments which are passed to make but only for catkin packages. It collects all of following arguments until a "--" is read. --no-catkin-make-args Pass no additional arguments to make for catkin packages (does not affect --make-args). dell@dell-Precision-3660:~/catkin_ws$ catkin_make -j1 找不到命令 “catkin_make”,但可以通过以下软件包安装它: sudo apt install catkin dell@dell-Precision-3660:~/catkin_ws$ 不是显示安装成功了嘛,怎么catkin_make -j1还是没用
06-08
将这个CMakeLists.txt文件: cmake_minimum_required(VERSION 3.20) if(MSVC) # 设置工具集为v141(VS2017) set(CMAKE_GENERATOR_TOOLSET "v141" CACHE STRING "Platform Toolset" FORCE) set(CMAKE_GENERATOR_PLATFORM "x64") # 设置Windows SDK版本(根据实际安装版本修改) set(CMAKE_SYSTEM_VERSION "10.0.17763.0") endif() project(MCUSim LANGUAGES C) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Debug) endif() # 设置项目版本(可选) set(MCUSim_VERSION 1.0.0) # 设置C标准 set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) # 根据配置类型设置不同的编译选项 set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Add a postfix, usually for debug builds") # 设置可执行文件输出目录 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) # 定义源文件和头文件 set(APP_SOURCES "source/APP/Control/src/Control_can_api.c" "source/APP/Control/src/Control_config_api.c" "source/APP/Control/src/Control_emergencybraking_api.c" "source/APP/Control/src/Control_main_task.c" "source/APP/Control/src/Control_soc_api.c" "source/COM/com_log.c" "source/COM/seqqueue.c" "source/HAL/CAN/hal_can.c" "source/HAL/CAN/hal_can_api.c" "source/HAL/CAN/hal_can_ring_queue.c" "source/MID/CAN/mid_can_ctrl_api.c" "source/MID/CAN/mid_can_ctrl_drv.c" "source/MID/CAN/mid_can_ctrl_gen_acu_il.c" "source/MID/CAN/mid_can_ctrl_gen_asc_il.c" "source/MID/CAN/mid_can_ctrl_gen_eps_il.c" "source/MID/CAN/mid_can_ctrl_gen_esc_il.c" "source/MID/CAN/mid_can_ctrl_gen_gw_il.c" "source/MID/CAN/mid_can_ctrl_gen_ibooster_il.c" "source/MID/CAN/mid_can_ctrl_gen_il.c" "source/MID/CAN/mid_can_ctrl_gen_uss_il.c" "source/MID/CAN/mid_can_ctrl_gen_vcu_il.c" "source/MID/CAN/mid_can_ctrl_il.c" "source/MID/CAN/mid_can_ctrl_nm.c" "source/MID/CAN/mid_can_ctrl_task.c" "source/MID/CAN/mid_can_parser.c" "source/MID/Serial/DataLinkCtrl/mid_dl_ctrl_api.c" "source/MID/Serial/DataLinkCtrl/mid_dl_ctrl_callback.c" "source/MID/Serial/DataLinkCtrl/mid_dl_ctrl_main.c" "source/MID/ShareOBJ/mid_share_common_api.c" "source/MID/ShareOBJ/mid_share_control.c" "source/MID/ShareOBJ/mid_share_gen_acu_api.c" "source/MID/ShareOBJ/mid_share_gen_asc_api.c" "source/MID/ShareOBJ/mid_share_gen_eps_api.c" "source/MID/ShareOBJ/mid_share_gen_esc_api.c" "source/MID/ShareOBJ/mid_share_gen_gw_api.c" "source/MID/ShareOBJ/mid_share_gen_ibooster_api.c" "source/MID/ShareOBJ/mid_share_gen_uss_api.c" "source/MID/ShareOBJ/mid_share_gen_vcu_api.c" "source/OSM/osm.c" "source/OSM/osm_timer.c" "source/main.c" ) # 头文件路径(用于IDE显示,不是必须的,但为了清晰可以列出) file(GLOB_RECURSE HEADERS "source/APP/Control/include/*.h" "source/MID/Serial/DataLinkCtrl/*.h" "source/FreeRTOSv202012.00/FreeRTOS/Source/include/FreeRTOS.h" "source/FreeRTOSv202012.00/FreeRTOS/Demo/WIN32-MingW/FreeRTOSConfig.h" "source/FreeRTOSv202012.00/FreeRTOS/Source/include/*.h" ) # include_directories( # AFTER # SYSTEM "D:/mingw64/x86_64-w64-mingw32/include" # 标记为系统目录 # ) # add_compile_options(-isystem "D:/mingw64/x86_64-w64-mingw32/include") # 隔离系统头文件[^4] if(MSVC) add_compile_options(/w) # MSVC编译器 add_compile_options(/Zi) add_link_options(/DEBUG) else() add_compile_options(-w) # GCC/Clang编译器 endif() set(CMAKE_BUILD_TYPE Debug) if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") # -ggdb3 生成GDB专用调试信息,-O0 禁用优化 add_compile_options(-ggdb3 -O0 -fno-inline) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g") endif() # 创建可执行目标 add_executable(${PROJECT_NAME} ${APP_SOURCES} ${HEADERS}) # 包含目录 target_include_directories(${PROJECT_NAME} PRIVATE "source/ALL_INCLUDE" "source/COM" "source/ALL_INCLUDE/OSM" "source/MID/ShareOBJ" "source/APP/Control/include" "source/APP/Control/lib/include" "source/HAL/CAN" "source/MID/Serial/DataLinkCtrl" "source/FreeRTOSv202012.00/FreeRTOS/Source/include" "source/FreeRTOSv202012.00/FreeRTOS/Demo/WIN32-MingW" "source/FreeRTOSv202012.00/FreeRTOS/Source/portable/MSVC-MingW" "source/CanOSS" # "source/FreeRTOSv202012.00/FreeRTOS/Source/portable/MSVC-MingW" # "C:/Program Files (x86)/Kvaser/Canlib/INC" ) # 预处理器定义 target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<CONFIG:Debug>:WIN32;_DEBUG;_CONSOLE;WIN32_SIM;_CRT_SECURE_NO_WARNINGS> $<$<CONFIG:Release>:WIN32;NDEBUG;_CONSOLE> ) # 链接库目录 target_link_directories(${PROJECT_NAME} PRIVATE source/APP/Control/lib/X86 source/CanOSS # "C:/Program Files (x86)/Kvaser/Canlib/Lib/x64" ) # 链接库 target_link_libraries(${PROJECT_NAME} PRIVATE canlib32 ControlModelCal ) # 设置编译器警告级别等 if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /W3 /sdl /permissive- ) else() # 对于GCC或Clang,设置相应的选项 target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra # 以下安全选项可根据需要添加,注意不是所有平台都支持 # -D_FORTIFY_SOURCE=2 # -fstack-protector # 严格标准模式 -pedantic-errors ) endif() # 链接器选项 target_link_options(${PROJECT_NAME} PRIVATE /DEBUG # 生成调试信息(在Debug配置中) $<$<CONFIG:Debug>:/INCREMENTAL> # 增量链接(Debug) $<$<CONFIG:Release>:/INCREMENTAL:NO> # 非增量链接(Release) ) # 对于Release配置,开启全程序优化和优化引用 if(CMAKE_BUILD_TYPE STREQUAL "Release") target_compile_options(${PROJECT_NAME} PRIVATE /O2 # 优化级别(通常Release用/O2) /GL # 全程序优化 ) target_link_options(${PROJECT_NAME} PRIVATE /LTCG # 链接时代码生成(全程序优化) /OPT:REF # 优化引用 ) endif() # 设置字符集为Unicode(在Windows上) if(MSVC) target_compile_options(${PROJECT_NAME} PRIVATE /D_UNICODE /DUNICODE # 定义Unicode宏 ) # 或者使用add_definitions,但更推荐target_compile_definitions # target_compile_definitions(${PROJECT_NAME} PRIVATE _UNICODE UNICODE) endif() 改写进下面makefile文件中: # ========================================================================= # Unity - A Test Framework for C # ThrowTheSwitch.org # Copyright (c) 2007-24 Mike Karlesky, Mark VanderVoord, & Greg Williams # SPDX-License-Identifier: MIT # ========================================================================= #We try to detect the OS we are running on, and adjust commands as needed ifeq ($(OS),Windows_NT) ifeq ($(shell uname -s),) # not in a bash-like shell CLEANUP = del /F /Q MKDIR = mkdir else # in a bash-like shell, like msys CLEANUP = rm -f MKDIR = mkdir -p endif TARGET_EXTENSION=.exe else CLEANUP = rm -f MKDIR = mkdir -p TARGET_EXTENSION=.out endif C_COMPILER=gcc ifeq ($(shell uname -s), Darwin) C_COMPILER=clang endif UNITY_ROOT=../.. CFLAGS=-std=c89 CFLAGS += -Wall CFLAGS += -Wextra CFLAGS += -Wpointer-arith CFLAGS += -Wcast-align CFLAGS += -Wwrite-strings CFLAGS += -Wswitch-default CFLAGS += -Wunreachable-code CFLAGS += -Winit-self CFLAGS += -Wmissing-field-initializers CFLAGS += -Wno-unknown-pragmas CFLAGS += -Wstrict-prototypes CFLAGS += -Wundef CFLAGS += -Wold-style-definition #CFLAGS += -Wno-misleading-indentation TARGET_BASE1=test1 TARGET1 = $(TARGET_BASE1)$(TARGET_EXTENSION) SRC_FILES1=$(UNITY_ROOT)/src/unity.c src/test_main.c test/TestControlCode.c test/test_runners/TestControlCode_Runner.c INC_DIRS=-Isrc -I$(UNITY_ROOT)/src SYMBOLS= all: clean default default: $(SRC_FILES1) $(C_COMPILER) $(CFLAGS) $(INC_DIRS) $(SYMBOLS) $(SRC_FILES1) -o $(TARGET1) - ./$(TARGET1) # test/test_runners/TestProductionCode_Runner.c: test/TestProductionCode.c # ruby $(UNITY_ROOT)/auto/generate_test_runner.rb test/TestProductionCode.c test/test_runners/TestProductionCode_Runner.c # test/test_runners/TestProductionCode2_Runner.c: test/TestProductionCode2.c # ruby $(UNITY_ROOT)/auto/generate_test_runner.rb test/TestProductionCode2.c test/test_runners/TestProductionCode2_Runner.c clean: $(CLEANUP) $(TARGET1) $(TARGET2) ci: CFLAGS += -Werror ci: default
最新发布
10-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值