c++

xmakev259发布,改进C

发布时间:2022/3/8 14:31:47   点击数:
白癜风抗复发工程 http://m.360xh.com/xinwen/kjzh/58915.html

xmake是一个基于Lua的轻量级跨平台构建工具,使用xmake.lua维护项目构建,相比makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。

这个版本,我们增加了大量重量级的新特性,例如:Nim语言项目的构建支持,KeilMDK,Circle和Wasi工具链支持。

另外,我们对C++20Modules进行了大改进,不仅支持最新gcc-11,clang和msvc编译器,而且还得模块间依赖做了自动分析,实现最大程度的并行化编译支持。

最后,还有一个比较有用的特性就是UnityBuild支持,通过它我们可以对C++代码的编译速度做到很大程度的提升。

项目源码

官方文档

入门课程

新特性介绍Nimlang项目构建

最近,我们新增了对Nimlang项目的构建支持,相关issues见:#

创建空工程

我们可以使用xmakecreate命令创建空工程。

xmakecreate-lnim-tconsoletestxmakecreate-lnim-tstatictestxmakecreate-lnim-tsharedtest控制台程序

add_rules("mode.debug","mode.release")target("test")set_kind("binary")add_files("src/main.nim")

xmake-v[33%]:linking.releasetest/usr/local/bin/nimc--opt:speed--nimcache:build/.gens/test/macosx/x86_64/release/nimcache-o:build/macosx/x86_64/release/testsrc/main.nim[%]:buildok!静态库程序

add_rules("mode.debug","mode.release")target("foo")set_kind("static")add_files("src/foo.nim")target("test")set_kind("binary")add_deps("foo")add_files("src/main.nim")

xmake-v[33%]:linking.releaselibfoo.a/usr/local/bin/nimc--opt:speed--nimcache:build/.gens/foo/macosx/x86_64/release/nimcache--app:staticlib--noMain--passC:-DNimMain=NimMain_B6D5BD02--passC:-DNimMainInner=NimMainInner_B6D5BD02--passC:-DNimMainModule=NimMainModule_B6D5BD02--passC:-DPreMain=PreMain_B6D5BD02--passC:-DPreMainInner=PreMainInner_B6D5BD02-o:build/macosx/x86_64/release/libfoo.asrc/foo.nim[66%]:linking.releasetest/usr/local/bin/nimc--opt:speed--nimcache:build/.gens/test/macosx/x86_64/release/nimcache--passL:-Lbuild/macosx/x86_64/release--passL:-lfoo-o:build/macosx/x86_64/release/testsrc/main.nim[%]:buildok!动态库程序

add_rules("mode.debug","mode.release")target("foo")set_kind("shared")add_files("src/foo.nim")target("test")set_kind("binary")add_deps("foo")add_files("src/main.nim")

xmake-rv[33%]:linking.releaselibfoo.dylib/usr/local/bin/nimc--opt:speed--nimcache:build/.gens/foo/macosx/x86_64/release/nimcache--app:lib--noMain-o:build/macosx/x86_64/release/libfoo.dylibsrc/foo.nim[66%]:linking.releasetest/usr/local/bin/nimc--opt:speed--nimcache:build/.gens/test/macosx/x86_64/release/nimcache--passL:-Lbuild/macosx/x86_64/release--passL:-lfoo-o:build/macosx/x86_64/release/testsrc/main.nim[%]:buildok!C代码混合编译

add_rules("mode.debug","mode.release")target("foo")set_kind("static")add_files("src/*.c")target("test")set_kind("binary")add_deps("foo")add_files("src/main.nim")Nimble依赖包集成

完整例子见:NimblePackageExample

add_rules("mode.debug","mode.release")add_requires("nimble::zip0.3")target("test")set_kind("binary")add_files("src/main.nim")add_packages("nimble::zip")

main.nim

importzip/zlibechozlibVersion()Native依赖包集成

完整例子见:NativePackageExample

add_rules("mode.debug","mode.release")add_requires("zlib")target("test")set_kind("binary")add_files("src/main.nim")add_packages("zlib")

main.nim

proczlibVersion():cstring{.cdecl,importc}echozlibVersion()UnityBuild加速

我们知道,C++代码编译速度通常很慢,因为每个代码文件都需要解析引入的头文件。

而通过UnityBuild,我们通过将多个cpp文件组合成一个来加速项目的编译,其主要好处是减少了解析和编译包含在多个源文件中的头文件内容的重复工作,头文件的内容通常占预处理后源文件中的大部分代码。

Unity构建还通过减少编译链创建和处理的目标文件的数量来减轻由于拥有大量小源文件而导致的开销,并允许跨形成统一构建任务的文件进行过程间分析和优化(类似于效果链接时优化)。

它可以极大提升C/C++代码的编译速度,通常会有30%的速度提升,不过根据项目的复杂程度不同,其带来的效益还是要根据自身项目情况而定。

xmake在v2.5.9版本中,也已经支持了这种构建模式。相关issues见#。

如何启用?

我们提供了两个内置规则,分别处理对C和C++代码的UnityBuild。

add_rules("c.unity_build")add_rules("c++.unity_build")Batch模式

默认情况下,只要设置上述规则,就会启用Batch模式的UnityBuild,也就是xmake自动根据项目代码文件,自动组织合并。

target("test")set_kind("binary")add_includedirs("src")add_rules("c++.unity_build",{batchsize=2})add_files("src/*.c","src/*.cpp")

我们可以额外通过设置{batchsize=2}参数到规则,来指定每个合并Batch的大小数量,这里也就是每两个C++文件自动合并编译。

编译效果大概如下:

xmake-r[11%]:ccache

转载请注明:http://www.xienasc.com/jbtjt/23971.html

------分隔线----------------------------