From 8aa29328784bb9e7937ba3f8095e036c5fef5df9 Mon Sep 17 00:00:00 2001 From: Syngnat Date: Mon, 8 Jun 2026 18:53:55 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(ci):=20=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?DuckDB=20Windows=20=E5=8F=AF=E9=80=89=E9=A9=B1=E5=8A=A8?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E7=9A=84=20CGO=20=E5=8F=82=E6=95=B0=E6=B1=A1?= =?UTF-8?q?=E6=9F=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/dev-build.yml | 9 +++++---- .github/workflows/release.yml | 9 +++++---- internal/app/methods_driver.go | 3 ++- internal/app/methods_driver_version_test.go | 2 +- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index e30592c..f9fc1fa 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -556,7 +556,7 @@ jobs: rm -f "$zip_path" local attempt dll_path for attempt in 1 2 3; do - echo "📥 下载 DuckDB Windows 动态库 (${attempt}/3): ${DUCKDB_WINDOWS_LIBRARY_URL}" + echo "📥 下载 DuckDB Windows 动态库 (${attempt}/3): ${DUCKDB_WINDOWS_LIBRARY_URL}" >&2 if curl --retry 3 --retry-delay 2 --retry-all-errors --connect-timeout 20 --max-time 300 -fsSL "$DUCKDB_WINDOWS_LIBRARY_URL" -o "$zip_path"; then if unzip -tq "$zip_path" >/dev/null 2>&1; then rm -rf "$lib_dir" @@ -575,12 +575,12 @@ jobs: echo "$lib_dir" return 0 fi - echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll,准备重试" + echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll,准备重试" >&2 else - echo "⚠️ DuckDB Windows 动态库压缩包校验失败,准备重试" + echo "⚠️ DuckDB Windows 动态库压缩包校验失败,准备重试" >&2 fi else - echo "⚠️ DuckDB Windows 动态库下载失败,准备重试" + echo "⚠️ DuckDB Windows 动态库下载失败,准备重试" >&2 fi rm -f "$zip_path" rm -rf "$lib_dir" @@ -618,6 +618,7 @@ jobs: if [ -n "$DUCKDB_LIB_DIR" ]; then DUCKDB_LIB_DIR_GCC="$(cygpath -m "$DUCKDB_LIB_DIR")" DUCKDB_LIB_DIR_PATH="$(cygpath -u "$DUCKDB_LIB_DIR")" + # cgo 会把每个 CGO_LDFLAGS 片段转成 //go:cgo_ldflag,-L 参数不能再额外包引号。 DUCKDB_WINDOWS_CGO_LDFLAGS="-L${DUCKDB_LIB_DIR_GCC} -lduckdb -lstdc++ -lm -lws2_32 -lwsock32 -lrstrtmgr" CGO_ENABLED=1 GOOS="$GOOS" GOARCH="$GOARCH" CGO_LDFLAGS="${DUCKDB_WINDOWS_CGO_LDFLAGS}" PATH="${DUCKDB_LIB_DIR_PATH}:$PATH" go build \ -tags "${BUILD_TAGS}" \ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6a261e6..3afcc10 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -554,7 +554,7 @@ jobs: rm -f "$zip_path" local attempt dll_path for attempt in 1 2 3; do - echo "📥 下载 DuckDB Windows 动态库 (${attempt}/3): ${DUCKDB_WINDOWS_LIBRARY_URL}" + echo "📥 下载 DuckDB Windows 动态库 (${attempt}/3): ${DUCKDB_WINDOWS_LIBRARY_URL}" >&2 if curl --retry 3 --retry-delay 2 --retry-all-errors --connect-timeout 20 --max-time 300 -fsSL "$DUCKDB_WINDOWS_LIBRARY_URL" -o "$zip_path"; then if unzip -tq "$zip_path" >/dev/null 2>&1; then rm -rf "$lib_dir" @@ -573,12 +573,12 @@ jobs: echo "$lib_dir" return 0 fi - echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll,准备重试" + echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll,准备重试" >&2 else - echo "⚠️ DuckDB Windows 动态库压缩包校验失败,准备重试" + echo "⚠️ DuckDB Windows 动态库压缩包校验失败,准备重试" >&2 fi else - echo "⚠️ DuckDB Windows 动态库下载失败,准备重试" + echo "⚠️ DuckDB Windows 动态库下载失败,准备重试" >&2 fi rm -f "$zip_path" rm -rf "$lib_dir" @@ -616,6 +616,7 @@ jobs: if [ -n "$DUCKDB_LIB_DIR" ]; then DUCKDB_LIB_DIR_GCC="$(cygpath -m "$DUCKDB_LIB_DIR")" DUCKDB_LIB_DIR_PATH="$(cygpath -u "$DUCKDB_LIB_DIR")" + # cgo 会把每个 CGO_LDFLAGS 片段转成 //go:cgo_ldflag,-L 参数不能再额外包引号。 DUCKDB_WINDOWS_CGO_LDFLAGS="-L${DUCKDB_LIB_DIR_GCC} -lduckdb -lstdc++ -lm -lws2_32 -lwsock32 -lrstrtmgr" CGO_ENABLED=1 GOOS="$GOOS" GOARCH="$GOARCH" CGO_LDFLAGS="${DUCKDB_WINDOWS_CGO_LDFLAGS}" PATH="${DUCKDB_LIB_DIR_PATH}:$PATH" go build \ -tags "${BUILD_TAGS}" \ diff --git a/internal/app/methods_driver.go b/internal/app/methods_driver.go index 864aa11..64d01a1 100644 --- a/internal/app/methods_driver.go +++ b/internal/app/methods_driver.go @@ -4132,7 +4132,8 @@ func withEnvValue(env []string, key string, value string) []string { func duckDBWindowsDynamicLibraryCGOLDFlags(libDir string) string { normalizedDir := filepath.ToSlash(strings.TrimSpace(libDir)) parts := []string{ - fmt.Sprintf("-L\"%s\"", normalizedDir), + // cgo 会把每个 CGO_LDFLAGS 片段转成 //go:cgo_ldflag,带引号的 -L 在 windows/amd64 上会被当成非法参数。 + fmt.Sprintf("-L%s", normalizedDir), "-lduckdb", "-lstdc++", "-lm", diff --git a/internal/app/methods_driver_version_test.go b/internal/app/methods_driver_version_test.go index d27d8ae..e7764b9 100644 --- a/internal/app/methods_driver_version_test.go +++ b/internal/app/methods_driver_version_test.go @@ -430,7 +430,7 @@ func TestDuckDBWindowsBuildUsesDynamicLibraryTag(t *testing.T) { func TestDuckDBWindowsDynamicLibraryCGOLDFlagsIncludeSupportLibraries(t *testing.T) { flags := duckDBWindowsDynamicLibraryCGOLDFlags(`C:\tmp\duckdb lib`) for _, expected := range []string{ - `-L"C:/tmp/duckdb lib"`, + `-LC:/tmp/duckdb lib`, "-lduckdb", "-lstdc++", "-lm",