V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
waruqi
V2EX  ›  程序员

如何快速构建一个简单的程序

  •  
  •   waruqi ·
    waruqi · 2016-07-16 22:59:48 +08:00 · 2251 次点击
    这是一个创建于 3043 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先我们通过内置的工程模板创建一个空工程:

    $ xmake create -P ./hello
    
    create hello ...
    create ok!👌
    

    这个时候 xmake 将会产生一些工程文件,如下:

    $ cd ./hello
    $ tree .
    
    .
    ├── src
    │   └── main.c
    └── xmake.lua
    

    这个简单的程序仅仅只是为了打印输出: hello xmake!

    $ cat ./src/main.c 
    
    #include <stdio.h>
    int main(int argc, char** argv)
    {
        printf("hello xmake!\n");
        return 0;
    }
    

    xmake.lua是基于 lua 语法的工程描述文件,它很简单:

    $ cat xmake.lua 
    
    target("hello")
        set_kind("binary")
        add_files("src/*.c") 
    
    

    现在我们开始编译这个程序

    $ xmake
    
    checking for the architecture ... x86_64
    checking for the Xcode SDK version for macosx ... 10.11
    checking for the target minimal version ... 10.11
    checking for the c compiler (cc) ... xcrun -sdk macosx clang
    checking for the c++ compiler (cxx) ... xcrun -sdk macosx clang
    checking for the objc compiler (mm) ... xcrun -sdk macosx clang
    checking for the objc++ compiler (mxx) ... xcrun -sdk macosx clang++
    checking for the assember (as) ... xcrun -sdk macosx clang
    checking for the linker (ld) ... xcrun -sdk macosx clang++
    checking for the static library archiver (ar) ... xcrun -sdk macosx ar
    checking for the static library extractor (ex) ... xcrun -sdk macosx ar
    checking for the shared library linker (sh) ... xcrun -sdk macosx clang++
    checking for the swift compiler (sc) ... xcrun -sdk macosx swiftc
    checking for the debugger (dd) ... xcrun -sdk macosx lldb
    configure
    {
        ex = "xcrun -sdk macosx ar"
    ,   ccache = "ccache"
    ,   plat = "macosx"
    ,   ar = "xcrun -sdk macosx ar"
    ,   buildir = "build"
    ,   as = "xcrun -sdk macosx clang"
    ,   sh = "xcrun -sdk macosx clang++"
    ,   arch = "x86_64"
    ,   mxx = "xcrun -sdk macosx clang++"
    ,   xcode_dir = "/Applications/Xcode.app"
    ,   target_minver = "10.11"
    ,   sc = "xcrun -sdk macosx swiftc"
    ,   mode = "release"
    ,   make = "make"
    ,   cc = "xcrun -sdk macosx clang"
    ,   host = "macosx"
    ,   dd = "xcrun -sdk macosx lldb"
    ,   kind = "static"
    ,   ld = "xcrun -sdk macosx clang++"
    ,   xcode_sdkver = "10.11"
    ,   cxx = "xcrun -sdk macosx clang"
    ,   mm = "xcrun -sdk macosx clang"
    }
    configure ok!
    clean ok!
    [00%]: ccache compiling.release src/main.c
    [100%]: linking.release hello
    build ok!👌
    

    接着运行它:

    $ xmake run hello
    
    hello world!
    

    或者进行调试

    $ xmake run -d hello 
    
    [lldb]$target create "build/hello"
    Current executable set to 'build/hello' (x86_64).
    [lldb]$b main
    Breakpoint 1: where = hello`main, address = 0x0000000100000f50
    [lldb]$r
    Process 7509 launched: '/private/tmp/hello/build/hello' (x86_64)
    Process 7509 stopped
    * thread #1: tid = 0x435a2, 0x0000000100000f50 hello`main, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
        frame #0: 0x0000000100000f50 hello`main
    hello`main:
    ->  0x100000f50 <+0>:  pushq  %rbp
        0x100000f51 <+1>:  movq   %rsp, %rbp
        0x100000f54 <+4>:  leaq   0x2b(%rip), %rdi          ; "hello world!"
        0x100000f5b <+11>: callq  0x100000f64               ; symbol stub for: puts
    [lldb]$
    

    接着我们尝试构建一个 android 版本,这个时候得设置 ndk 路径,当然也能配置到全局配置中,一劳永逸

    $ xmake f -p android --ndk=~/files/android-ndk-r10e/
    
    checking for the architecture ... armv7-a
    checking for the SDK version of NDK ... android-21
    checking for the c compiler (cc) ... arm-linux-androideabi-gcc
    checking for the c++ compiler (cxx) ... arm-linux-androideabi-g++
    checking for the assember (as) ... arm-linux-androideabi-gcc
    checking for the linker (ld) ... arm-linux-androideabi-g++
    checking for the static library archiver (ar) ... arm-linux-androideabi-ar
    checking for the static library extractor (ex) ... arm-linux-androideabi-ar
    checking for the shared library linker (sh) ... arm-linux-androideabi-g++
    configure
    {
        ex = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar"
    ,   ccache = "ccache"
    ,   ndk = "~/files/android-ndk-r10e/"
    ,   sc = "xcrun -sdk macosx swiftc"
    ,   ar = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-ar"
    ,   ld = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++"
    ,   buildir = "build"
    ,   host = "macosx"
    ,   as = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc"
    ,   toolchains = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin"
    ,   arch = "armv7-a"
    ,   mxx = "xcrun -sdk macosx clang++"
    ,   xcode_dir = "/Applications/Xcode.app"
    ,   target_minver = "10.11"
    ,   ndk_sdkver = 21
    ,   mode = "release"
    ,   cc = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gcc"
    ,   cxx = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++"
    ,   make = "make"
    ,   dd = "xcrun -sdk macosx lldb"
    ,   kind = "static"
    ,   sh = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-g++"
    ,   xcode_sdkver = "10.11"
    ,   plat = "android"
    ,   mm = "xcrun -sdk macosx clang"
    }
    configure ok!
    
    $ xmake
    
    clean ok!
    [00%]: ccache compiling.release src/main.c
    [100%]: linking.release hello
    build ok!👌
    

    或者我们编一个 iphoneos 的版本,例如:

    $ xmake f -p iphoneos
    
    checking for the architecture ... armv7
    checking for the Xcode SDK version for iphoneos ... 9.2
    checking for the target minimal version ... 9.2
    checking for the c compiler (cc) ... xcrun -sdk iphoneos clang
    checking for the c++ compiler (cxx) ... xcrun -sdk iphoneos clang
    checking for the objc compiler (mm) ... xcrun -sdk iphoneos clang
    checking for the objc++ compiler (mxx) ... xcrun -sdk iphoneos clang++
    checking for the assember (as) ... gas-preprocessor.pl xcrun -sdk iphoneos clang
    checking for the linker (ld) ... xcrun -sdk iphoneos clang++
    checking for the static library archiver (ar) ... xcrun -sdk iphoneos ar
    checking for the static library extractor (ex) ... xcrun -sdk iphoneos ar
    checking for the shared library linker (sh) ... xcrun -sdk iphoneos clang++
    checking for the swift compiler (sc) ... xcrun -sdk iphoneos swiftc
    configure
    {
        ex = "xcrun -sdk iphoneos ar"
    ,   ccache = "ccache"
    ,   ndk = "~/files/android-ndk-r10e/"
    ,   sc = "xcrun -sdk iphoneos swiftc"
    ,   ar = "xcrun -sdk iphoneos ar"
    ,   sh = "xcrun -sdk iphoneos clang++"
    ,   buildir = "build"
    ,   xcode_dir = "/Applications/Xcode.app"
    ,   as = "/usr/local/share/xmake/tools/utils/gas-preprocessor.pl xcrun -sdk iphoneos clang"
    ,   toolchains = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin"
    ,   arch = "armv7"
    ,   mxx = "xcrun -sdk iphoneos clang++"
    ,   ndk_sdkver = 21
    ,   target_minver = "9.2"
    ,   cc = "xcrun -sdk iphoneos clang"
    ,   mode = "release"
    ,   host = "macosx"
    ,   cxx = "xcrun -sdk iphoneos clang"
    ,   make = "make"
    ,   dd = "xcrun -sdk macosx lldb"
    ,   kind = "static"
    ,   ld = "xcrun -sdk iphoneos clang++"
    ,   xcode_sdkver = "9.2"
    ,   plat = "iphoneos"
    ,   mm = "xcrun -sdk iphoneos clang"
    }
    configure ok!
    
    $ xmake
     
    [00%]: ccache compiling.release src/main.c
    [100%]: linking.release hello
    build ok!👌
    

    最后我们尝试为 mingw 平台进行编译, sdk 指定交叉工具链目录,交叉编译 linux 平台也可以这么用哦。。

    $ xmake f -p mingw --sdk=/usr/local/i386-mingw32-4.3.0/
    
    checking for the architecture ... i386
    checking for the c compiler (cc) ... i386-mingw32-gcc
    checking for the c++ compiler (cxx) ... i386-mingw32-g++
    checking for the assember (as) ... i386-mingw32-gcc
    checking for the linker (ld) ... i386-mingw32-g++
    checking for the static library archiver (ar) ... i386-mingw32-ar
    checking for the static library extractor (ex) ... i386-mingw32-ar
    checking for the shared library linker (sh) ... i386-mingw32-g++
    checking for the swift compiler (sc) ... no
    configure
    {
        ex = "/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-ar"
    ,   ccache = "ccache"
    ,   ndk = "~/files/android-ndk-r10e/"
    ,   sc = "xcrun -sdk iphoneos swiftc"
    ,   sdk = "/usr/local/i386-mingw32-4.3.0/"
    ,   cc = "/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-gcc"
    ,   ndk_sdkver = 21
    ,   buildir = "build"
    ,   plat = "mingw"
    ,   as = "/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-gcc"
    ,   toolchains = "/Users/ruki/files/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin"
    ,   arch = "i386"
    ,   mxx = "xcrun -sdk iphoneos clang++"
    ,   xcode_dir = "/Applications/Xcode.app"
    ,   target_minver = "9.2"
    ,   sh = "/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-g++"
    ,   mode = "release"
    ,   host = "macosx"
    ,   cxx = "/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-g++"
    ,   make = "make"
    ,   dd = "xcrun -sdk macosx lldb"
    ,   kind = "static"
    ,   ar = "/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-ar"
    ,   xcode_sdkver = "9.2"
    ,   ld = "/usr/local/i386-mingw32-4.3.0/bin/i386-mingw32-g++"
    ,   mm = "xcrun -sdk iphoneos clang"
    }
    configure ok!
    
    $ xmake
    
    [00%]: ccache compiling.release src/main.c
    [100%]: linking.release hello.exe
    build ok!👌
    

    xmake 还能直接在 windows 的 cmd 终端下,进行直接编译 windows 的程序,它会去自动检测当前系统装的 vs 环境,调用里面的 cl.exe 编译器进行编译,一切都是自动化的,我们不需要额外配置什么,只需要执行:xmake 就行了。。

    例如:

    $ xmake
    
    checking for the architecture ... x86
    checking for the Microsoft Visual Studio version ... 2008
    checking for the c compiler (cc) ... cl.exe
    checking for the c++ compiler (cxx) ... cl.exe
    checking for the assember (as) ... ml.exe
    checking for the linker (ld) ... link.exe
    checking for the static library archiver (ar) ... link.exe -lib
    checking for the shared library linker (sh) ... link.exe -dll
    checking for the static library extractor (ex) ... lib.exe
    configure
    {
        ex = "lib.exe"
    ,   sh = "link.exe -dll"
    ,   host = "windows"
    ,   ar = "link.exe -lib"
    ,   as = "ml.exe"
    ,   plat = "windows"
    ,   buildir = "build"
    ,   arch = "x86"
    ,   cc = "cl.exe"
    ,   cxx = "cl.exe"
    ,   mode = "release"
    ,   clean = true
    ,   kind = "static"
    ,   ld = "link.exe"
    ,   vs = "2008"
    }
    configure ok!
    [00%]: compiling.release src\main.c
    [100%]: linking.release hello.exe
    build ok!
    

    顺便说一下,在 windows 下编译, xmake 是完全支持多任务的哦,默认就是自动多任务构建的,比起以前在 msys, cygwin 里面用 gmake 来编译快多了,因为 windows 下的 gmake 就算你启用了-j 4 也没啥效果,非常非常得慢。。。


    3 条回复    2016-07-17 22:49:48 +08:00
    matthewgao
        1
    matthewgao  
       2016-07-16 23:24:38 +08:00
    感觉和 cmake 差不多么
    waruqi
        2
    waruqi  
    OP
       2016-07-17 09:35:53 +08:00
    个人不太习惯 cmake 的语法,而且 cmake 只能生成 IDE 的工程文件, xmake 是直接编译为主。。
    waruqi
        3
    waruqi  
    OP
       2016-07-17 22:49:48 +08:00
    我录了个演示视频,可以看下。。 https://asciinema.org/a/79998
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3518 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:35 · PVG 18:35 · LAX 02:35 · JFK 05:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.