xmake-vscode配置

1、下載并安裝vscode
2、下載并安裝語言包
image.png
3、下載并安裝“C/C++ for Visual Studio Code”插件(必備的插件,如果不安裝,代碼無法跳轉(zhuǎn),也沒有自動補全)
image.png
4、下載并安裝“C/C++ Extension Pack”
image.png
5、下載CodeLLDB(用于調(diào)試C/CPP代碼)
image.png

如果遇到無法訪問:https://github.com/vadimcn/vscode-lldb/releases/download/v1.8.1/codelldb-x86_64-windows.vsix,如:

image.png

可以多嘗試幾次。

將VSIX下載的本地之后,可以按照如下方式進行安裝:

image.png
6、下載并安裝“Git Graph” (Git版本控制)
image.png
7、下載并安裝“compareit”(比對工具)
image.png
8、下載并安裝“TODO Highlight”(高亮顯示TODO內(nèi)容)
image.png
9、下載并安裝“xmake”
image.png

本地也需要安裝xmake:Releases · xmake-io/xmake (github.com)

10、創(chuàng)建C++工程

【1】選擇一個文件夾
【2】查看 -> 命令面板 ->
【3】XMake:NewFiles


image.png

可以直接選擇命令:XMake:CreateProject,但是還是避免不了選擇一個文件夾。

11、Xmake常用工具

【1】編譯

image.png

在這里可以選擇debug模式或者release模式。

image.png

可以選擇其它平臺,實現(xiàn)交叉編譯:

image.png

【2】運行

image.png

【3】斷點

image.png

【4】編譯架構(gòu)

image.png

【5】宏記錄

image.png

【6】宏回放

image.png

【7】編譯目標

image.png

下圖所示,默認編譯所有的目標:

image.png

可以在xmake.lua文件種配置多個目標:

add_rules("mode.debug", "mode.release")

target("test1")
    set_kind("binary")
    add_files("src/*.cpp")

target("test2")
    set_kind("binary")
    add_files("src/*.cpp")

target("test3")
    set_kind("binary")
    add_files("src/*.cpp")
image.png

可以選擇具體某個目標,這樣編譯的時候只會編譯具體某個目標。

通過 add_files 函數(shù)可以添加編譯目標具體的文件。

【8】編譯等級

文件 -> 首選項 -> 設(shè)置 -> 搜索xmake
image.png

默認是warning,如果選擇verbose,編譯時就會在控制臺打印詳細的編譯信息。

11、C++生成的目標文件

C++生成的目標文件可能是:可執(zhí)行文件,靜態(tài)庫,動態(tài)庫。

在xmake.lua文件中可以指定這三種類型:

   set_kind("binary")  // 可執(zhí)行文件
   set_kind("static")  // 靜態(tài)庫
   set_kind("shared") // 動態(tài)庫

設(shè)置目標類型,目前支持的類型有:

描述
phony 假的目標程序
binary 二進制程序
static 靜態(tài)庫程序
shared 動態(tài)庫程序
object 僅僅編譯對象集合
headeronly 僅僅頭文件集合
12、添加宏定義

編譯宏的設(shè)置,大多數(shù)c/c++項目都會用到,一般如果我們設(shè)置編譯flags傳給gcc/clang,都是要配置:-DXXX

而在xmake里面,提供了add_defines()內(nèi)置接口來配置:

add_defines("XXX")

可以通過 is_plat 判斷平臺

if is_plat("linux", "macosx") then
   add_defines("YYY") 
end

以上代碼的意思是,如果是linux或macosx平臺,那么則添加額外的宏。

13、全局配置
target("test1")
    add_defines("TEST1")

target("test2")
    add_defines("TEST2")

一般情況下,在 target 下的配置都是屬于當前 target 下的局部配置,是屬于某個 target 的,當下一個 target 開始時,會自動結(jié)束上一個 target。

但是,如果想要配置全局的配置,那么可以這樣做:

add_defines("XXX")  -- 全局配置
target("test1")
    add_defines("TEST1")

target("test2")
    add_defines("TEST2")

宏定義XXX是全局的配置。

也可以使用 target_end 結(jié)束 target,結(jié)束 target 之后的配置是全局的:

target("test1")
    add_defines("TEST1")
target_end()

add_defines("XXX")  -- 全局配置

target("test2")
    add_defines("TEST2")
14、添加編譯選項

xmake可以使用 add_cflags 、add_cxflags、add_cxxflags 函數(shù)添加編譯選項。

add_cflags:僅添加C代碼相關(guān)編譯flags
add_cxflags:添加C/C++代碼相關(guān)編譯flags
add_cxxflags:僅添加C++代碼相關(guān)編譯flags

一些配置在某個平臺上不支持,可以先判斷平臺再添加編譯選項:

-- 添加編譯選項
add_cxxflags("-g", "-O2", "-DDEBUG")
if is_plat("windows") then
    add_cflags("/MT")
end

所有選項值都基于gcc的定義為標準,如果其他編譯器不兼容(例如:vc),xmake會自動內(nèi)部將其轉(zhuǎn)換成對應(yīng)編譯器支持的選項值。 用戶無需操心其兼容性,如果其他編譯器沒有對應(yīng)的匹配值,那么xmake會自動忽略器設(shè)置。

我們也可以通過force參數(shù)來強制禁用flags的自動檢測,直接傳入編譯器,哪怕編譯器有可能不支持,也會設(shè)置:

add_cflags("-g", "-O2", {force = true})
15、添加庫相關(guān)設(shè)置
add_links("pthread") -- 鏈接庫名
add_includedirs("src/head/ls_02") -- 設(shè)置頭文件搜索目錄(--cxflags="-I/xxx")
add_linkdirs("/usr/local/include") -- 設(shè)置庫搜索目錄
add_sysincludedirs("") -- 設(shè)置系統(tǒng)頭文件搜索目錄(-isystem /usr/include)

為了保證鏈接庫的依賴順序,系統(tǒng)庫鏈接通常都會比較靠后,我們通過add_syslinks()來專門設(shè)置系統(tǒng)庫鏈接,而add_links()通常用于非系統(tǒng)庫鏈接:

target("test") 
    set_kind("binary") 
    add_links("A", "B") 
    add_syslinks("pthread")
16、設(shè)置語言標準

c標準和c++標準可同時進行設(shè)置,例如:

-- 設(shè)置c代碼標準:c99, c++代碼標準:c++11
set_languages("c99", "c++11")

支持的語言標準目前主要有以下幾個:

描述
ansi c語言標準: ansi
c89 c語言標準: c89
gnu89 c語言標準: gnu89
c99 c語言標準: c99
gnu99 c語言標準: gnu99
c11 c語言標準: c11
c17 c語言標準: c17
clatest c語言標準: clatest
描述
cxx98 c++語言標準: c++98
gnuxx98 c++語言標準: gnu++98
cxx11 c++語言標準: c++11
gnuxx11 c++語言標準: gnu++11
cxx14 c++語言標準: c++14
gnuxx14 c++語言標準: gnu++14
cxx1z c++語言標準: c++1z
gnuxx1z c++語言標準: gnu++1z
cxx17 c++語言標準: c++17
gnuxx17 c++語言標準: gnu++17
cxx20 c++語言標準: c++20
gnuxx20 c++語言標準: gnu++20
cxxlatest c++語言標準: c++latest
gnuxxlatest c++語言標準: gnu++latest
17、設(shè)置編譯優(yōu)化

xmake提供了幾種內(nèi)置的編譯優(yōu)化配置:none, fast, faster, fastest, smallest, aggressive,來實現(xiàn)各種級別的編譯優(yōu)化。

-- 最快運行速度的優(yōu)化
set_optimize("fastest")
描述 gcc/clang msvc
none 禁用優(yōu)化 -O0 -Od
fast 快速優(yōu)化 -O1 default
faster 更快的優(yōu)化 -O2 -O2
fastest 最快運行速度的優(yōu)化 -O3 -Ox -fp:fast
smallest 最小化代碼優(yōu)化 -Os -O1 -GL
aggressive 過度優(yōu)化 -Ofast -Ox -fp:fast
18、添加源文件
add_files("src/test_*.c") 
add_files("src/xxx/**.cpp") 
add_files("src/asm/*.S", "src/objc/**/hello.m")

其中通配符表示匹配當前目錄下文件,而*則匹配多級目錄下的文件。

在添加源文件的同時排除一些源文件:

-- 遞歸添加src下的所有c文件,但是不包括src/impl/下的所有c文件
add_files("src/**.c|impl/*.c")

-- 添加src下的所有cpp文件,但是不包括src/test.cpp、src/hello.cpp以及src下所有帶xx_前綴的cpp文件
add_files("src/*.cpp|test.cpp|hello.cpp|xx_*.cpp")
19、刪除源文件
target("test") 
     add_files("src/*.c") 
    del_files("src/test.c")

上面的例子,可以從src目錄下添加除test.c以外的所有文件,當然這個也可以通過

add_files("src/*.c|test.c")

來達到相同的目的。

20、設(shè)置strip模式

設(shè)置當前目標的strip模式,目前支持一下模式:

描述
debug 鏈接的時候,strip掉調(diào)試符號
all 鏈接的時候,strip掉所有符號,包括調(diào)試符號

這個api一般在release模式下使用,可以生成更小的二進制程序。

set_strip("all")
21、設(shè)置是否啟用或禁用目標
set_enabled(true)
22、設(shè)置是否為默認構(gòu)建安裝目標
set_default(false)
23、設(shè)置關(guān)聯(lián)選項
-- 定義一個hello選項
option("hello")
    set_default(false)
    set_showmenu(true)
    add_defines("HELLO_ENABLE")

target("test")
    -- 如果hello選項被啟用了,這個時候就會將-DHELLO_ENABLE宏應(yīng)用到test目標上去
    set_options("hello")
24、條件判斷的api
接口 描述 支持版本
is_os 判斷當前構(gòu)建目標的操作系統(tǒng) >= 2.0.1
is_arch 判斷當前編譯架構(gòu) >= 2.0.1
is_plat 判斷當前編譯平臺 >= 2.0.1
is_host 判斷當前主機環(huán)境操作系統(tǒng) >= 2.1.4
is_mode 判斷當前編譯模式 >= 2.0.1
is_kind 判斷當前編譯類型 >= 2.0.1
is_config 判斷指定配置是否為給定的值 >= 2.2.2
has_config 判斷配置是否啟用或者存在 >= 2.2.2
has_package 判斷依賴包是否被啟用或者存在 >= 2.2.3
25、基于Android的交叉編譯

【1】選擇Android平臺

image.png

【2】在首選項中配置Android NDK路徑

image.png

必須要配置Android NDK的路徑,否則Android的交叉編譯無效。

【3】點擊編譯

image.png
26、更多配置
-- 設(shè)置目標文件名字不帶后綴跟前綴
set_basename("")

-- 設(shè)置目標文件名字帶后綴跟前綴
set_filename("")

-- 設(shè)置目標文件的的前綴
set_prefixname("")

-- 設(shè)置目標文件的的后綴(如將默認的:libtest.so 改成 libtest-d.so)
set_suffixname("-d")

-- 設(shè)置目標文件的擴展名(例如將默認的:libtest.so 改成 test.dll)
set_extension(".dll")

-- 設(shè)置警告級別
-- none 禁用所有警告
-- less 啟用較少的警告
-- more 啟用較多的警告
-- all 啟用所有警告
-- allextra 啟用所有警告+額外的警告
-- everything 啟用全部支持的警告
-- error 將所有警告作為編譯錯誤
set_warnings("all", "error")

-- 設(shè)置c預(yù)編譯頭文件
set_pcheader("header.h")

-- 設(shè)置c++預(yù)編譯頭文件
set_pcxxheader("header.h")

-- 添加子工程目標依賴
add_deps("test1", "test2")
27、xmake.lua文件目標配置示例
target("test1")
    set_kind("binary") -- 生成可執(zhí)行文件,windows平臺生成.exe文件
    set_basename("test1_$(mode)_$(arch)")
    -- 相當于add_cxxflags("-Isrc/head/ls_02 -Isrc/head/ls_03 -Isrc/head/ls_04 -Isrc/head/ls_05 -Isrc/head/ls_06")
    add_includedirs("src/head/ls_02", "src/head/ls_03", "src/head/ls_04", "src/head/ls_05", "src/head/ls_06")
    add_files("src/main.cpp", "src/cpp/**.cpp")
target_end()

target("test2")
    set_kind("static") -- 生成可靜態(tài)庫,windows平臺生成.lib文件,Android平臺生成.a文件
    set_basename("test1_$(mode)_$(arch)")
    -- 相當于add_cxxflags("-Isrc/head/ls_02 -Isrc/head/ls_03 -Isrc/head/ls_04 -Isrc/head/ls_05 -Isrc/head/ls_06")
    add_includedirs("src/head/ls_02", "src/head/ls_03", "src/head/ls_04", "src/head/ls_05", "src/head/ls_06")
    add_files("src/main.cpp", "src/cpp/**.cpp")
target_end()

target("test3")
    set_kind("shared") -- 生成動態(tài)庫,windows平臺生成.dll文件,Android平臺生成.so文件
    set_basename("test1_$(mode)_$(arch)")
    -- 相當于add_cxxflags("-Isrc/head/ls_02 -Isrc/head/ls_03 -Isrc/head/ls_04 -Isrc/head/ls_05 -Isrc/head/ls_06")
    add_includedirs("src/head/ls_02", "src/head/ls_03", "src/head/ls_04", "src/head/ls_05", "src/head/ls_06")
    add_files("src/main.cpp", "src/cpp/**.cpp")
target_end()
28、xmake更加詳細的信息

https://xmake.io/mirror/zh-cn/manual/project_target.html
https://xmake.io/#/zh-cn/getting_started

[本章完...]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容