diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index e78f4a3..e30592c 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -616,7 +616,10 @@ jobs: echo "🔧 构建 ${OUTPUT_PATH} (tags=${BUILD_TAGS})" if [ "$DRIVER" = "duckdb" ]; then if [ -n "$DUCKDB_LIB_DIR" ]; then - CGO_ENABLED=1 GOOS="$GOOS" GOARCH="$GOARCH" CGO_LDFLAGS="-L${DUCKDB_LIB_DIR} -lduckdb" PATH="${DUCKDB_LIB_DIR}:$PATH" go build \ + DUCKDB_LIB_DIR_GCC="$(cygpath -m "$DUCKDB_LIB_DIR")" + DUCKDB_LIB_DIR_PATH="$(cygpath -u "$DUCKDB_LIB_DIR")" + 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}" \ -trimpath \ -ldflags "-s -w" \ diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c3887dc..6a261e6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -614,7 +614,10 @@ jobs: echo "🔧 构建 ${OUTPUT_PATH} (tags=${BUILD_TAGS})" if [ "$DRIVER" = "duckdb" ]; then if [ -n "$DUCKDB_LIB_DIR" ]; then - CGO_ENABLED=1 GOOS="$GOOS" GOARCH="$GOARCH" CGO_LDFLAGS="-L${DUCKDB_LIB_DIR} -lduckdb" PATH="${DUCKDB_LIB_DIR}:$PATH" go build \ + DUCKDB_LIB_DIR_GCC="$(cygpath -m "$DUCKDB_LIB_DIR")" + DUCKDB_LIB_DIR_PATH="$(cygpath -u "$DUCKDB_LIB_DIR")" + 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}" \ -trimpath \ -ldflags "-s -w" \ diff --git a/internal/app/methods_driver.go b/internal/app/methods_driver.go index 1e1ef4b..864aa11 100644 --- a/internal/app/methods_driver.go +++ b/internal/app/methods_driver.go @@ -3835,7 +3835,7 @@ func buildOptionalDriverAgentFromSource(definition driverDefinition, executableP duckDBLibDir = libDir cleanupDuckDBLib = cleanup defer cleanupDuckDBLib() - env = withEnvValue(env, "CGO_LDFLAGS", fmt.Sprintf("-L\"%s\" -lduckdb", filepath.ToSlash(duckDBLibDir))) + env = withEnvValue(env, "CGO_LDFLAGS", duckDBWindowsDynamicLibraryCGOLDFlags(duckDBLibDir)) env = prependPathEnv(env, duckDBLibDir) } buildArgs = append(buildArgs, "-o", executablePath, "./cmd/optional-driver-agent") @@ -4129,6 +4129,20 @@ func withEnvValue(env []string, key string, value string) []string { return append(env, entry) } +func duckDBWindowsDynamicLibraryCGOLDFlags(libDir string) string { + normalizedDir := filepath.ToSlash(strings.TrimSpace(libDir)) + parts := []string{ + fmt.Sprintf("-L\"%s\"", normalizedDir), + "-lduckdb", + "-lstdc++", + "-lm", + "-lws2_32", + "-lwsock32", + "-lrstrtmgr", + } + return strings.Join(parts, " ") +} + func envValue(env []string, key string) string { normalizedKey := strings.ToUpper(strings.TrimSpace(key)) for _, item := range env { diff --git a/internal/app/methods_driver_version_test.go b/internal/app/methods_driver_version_test.go index 2898376..d27d8ae 100644 --- a/internal/app/methods_driver_version_test.go +++ b/internal/app/methods_driver_version_test.go @@ -427,6 +427,23 @@ 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"`, + "-lduckdb", + "-lstdc++", + "-lm", + "-lws2_32", + "-lwsock32", + "-lrstrtmgr", + } { + if !strings.Contains(flags, expected) { + t.Fatalf("expected flags %q to contain %q", flags, expected) + } + } +} + func TestInstallOptionalDriverAgentFromLocalZipExtractsDuckDBDLL(t *testing.T) { if runtime.GOOS != "windows" || runtime.GOARCH != "amd64" { t.Skip("DuckDB DLL support file is only required on windows/amd64")