# 构建目标 {#build-targets}

之前我们已经简单讲过，可以通过 `xmake build` 命令来构建工程。

这里我们再来详细讲解下，首先，我们先看下它的完整命令格式。

## 命令格式

```sh
$ xmake build [options] [target]
```

其中，`[target]` 指定需要构建的 target 目标，这是可选的，如果没有设置，那么默认会构建所有的目标程序（被标记为 default = false 的除外）。

执行效果如下：

```sh
$ xmake build
[ 17%]: cache compiling.release src/main.cpp
[ 23%]: cache compiling.release src/foo.cpp
[ 35%]: linking.release libfoo.a
[ 71%]: linking.release test
[100%]: build ok, spent 1.173s
```

通常我们可以省略后面的 `build` 子命令，因为 xmake 命令的默认行为就是执行构建。

```sh
$ xmake
[ 17%]: cache compiling.release src/main.cpp
[ 23%]: cache compiling.release src/foo.cpp
[ 35%]: linking.release libfoo.a
[ 71%]: linking.release test
[100%]: build ok, spent 1.173s
```

## 构建特定目标

如果要指定构建特定的目标程序，可以执行：

```sh
$ xmake build foo
```

:::tip 注意
这个时候，需要写全 build 子命令，否则目标名可能会跟其他子命令冲突。
:::

## 重新构建目标

```sh
$ xmake -r
```

或者

```sh
$ xmake --rebuild
```

都可以实现强制重新编译目标程序。

## 构建全部目标程序

如果 target 被配置为 `default = false`，那么默认是不会编译它的。

```lua
target("test")
    set_default(false)
    add_files("src/*.c")
```

如果想要构建所有目标， 包括这些 `default = false` 的目标程序，那么可以传递 `-a/--all` 参数。

```sh
$ xmake build -a
```

或者

```sh
$ xmake build --all
```

## 查找详细编译命令

如果我们想查看完整的编译器命令参数，来排查 flags 配置等问题，可以使用 `xmake -v`。

```sh
$ xmake -v
[ 23%]: cache compiling.release src/main.cpp
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -c -Qunused-arguments -target x86_64-apple-macos15.2 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -fvisibility=hidden -fvisibility-inlines-hidden -O3 -DNDEBUG -o build/.objs/test/macosx/x86_64/release/src/main.cpp.o src/main.cpp
[ 47%]: linking.release test
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -o build/macosx/x86_64/release/test build/.objs/test/macosx/x86_64/release/src/main.cpp.o -target x86_64-apple-macos15.2 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.2.sdk -lz -Wl,-x -Wl,-dead_strip
[100%]: build ok, spent 0.585s
```

## 查看错误日志和堆栈

如果在编译过程中遇到问题，构建失败了，会默认显示编译错误，但是如果配置上有语法错误，并不会显示完整的堆栈。

如果想要进一步定位问题，可以通过下面的命令，查看完整的构建日志，包括配置堆栈。

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

target("foo")
    set_kind("static")
    add_files("src/foo.cpp")

target("test")
    set_kind("binary")
    dd_deps("foo")   --------------- 不正确的接口
    add_files("src/main.cpp")
```

```sh
$ xmake -vD
error: @programdir/core/main.lua:329: @programdir/core/sandbox/modules/import/core/base/task.lua:65: @progr
amdir/core/project/project.lua:1050: ./xmake.lua:9: attempt to call a nil value (global 'dd_deps')
stack traceback:
    [./xmake.lua:9]: in main chunk  ----------------- 实际配置错误的地方

stack traceback:
        [C]: in function 'error'
        @programdir/core/base/os.lua:1075: in function 'os.raiselevel'
        (...tail calls...)
        @programdir/core/main.lua:329: in upvalue 'cotask'
        @programdir/core/base/scheduler.lua:406: in function <@programdir/core/base/scheduler.lua:399>
```

