fix: Makefile Windows 检测兼容 Msys2/MINGW 环境
uname -s 在 Msys2 上返回 MINGW64_NT-* 而非 Windows, 添加 findstring 匹配确保静态链接选项生效
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
+12
-1
@@ -9,6 +9,16 @@ LIB_SRC = dynamics_lib.c
|
|||||||
# 自动检测系统
|
# 自动检测系统
|
||||||
UNAME_S := $(shell uname -s 2>/dev/null || echo Windows)
|
UNAME_S := $(shell uname -s 2>/dev/null || echo Windows)
|
||||||
|
|
||||||
|
# Windows 检测:Msys2/MINGW 也视为 Windows
|
||||||
|
IS_WINDOWS := $(findstring MINGW,$(UNAME_S))
|
||||||
|
ifneq ($(IS_WINDOWS),)
|
||||||
|
UNAME_S := Windows
|
||||||
|
endif
|
||||||
|
IS_WINDOWS := $(findstring MSYS,$(UNAME_S))
|
||||||
|
ifneq ($(IS_WINDOWS),)
|
||||||
|
UNAME_S := Windows
|
||||||
|
endif
|
||||||
|
|
||||||
# DLL 输出到 engines/release/
|
# DLL 输出到 engines/release/
|
||||||
DLL_DIR = ../../release
|
DLL_DIR = ../../release
|
||||||
|
|
||||||
@@ -19,8 +29,9 @@ else ifeq ($(UNAME_S),Darwin)
|
|||||||
DLL_TARGET = $(DLL_DIR)/dynamics_c.dylib
|
DLL_TARGET = $(DLL_DIR)/dynamics_c.dylib
|
||||||
DLL_FLAGS = -dynamiclib
|
DLL_FLAGS = -dynamiclib
|
||||||
else
|
else
|
||||||
|
# Windows: 静态链接运行时,避免依赖 libgcc_s_seh-1.dll
|
||||||
DLL_TARGET = $(DLL_DIR)/dynamics_c.dll
|
DLL_TARGET = $(DLL_DIR)/dynamics_c.dll
|
||||||
DLL_FLAGS = -shared
|
DLL_FLAGS = -shared -static
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: all dll clean
|
.PHONY: all dll clean
|
||||||
|
|||||||
@@ -6,14 +6,17 @@ LIB_SRC = dynamics_lib.cpp
|
|||||||
|
|
||||||
UNAME_S := $(shell uname -s 2>/dev/null || echo Windows)
|
UNAME_S := $(shell uname -s 2>/dev/null || echo Windows)
|
||||||
|
|
||||||
CXXFLAGS = -O3 -march=native -std=c++17 -Wall -Wextra -D_USE_MATH_DEFINES
|
# Windows 检测:Msys2/MINGW 也视为 Windows
|
||||||
|
IS_WINDOWS := $(findstring MINGW,$(UNAME_S))
|
||||||
# Windows 下静态链接运行时
|
ifneq ($(IS_WINDOWS),)
|
||||||
ifeq ($(UNAME_S),Windows)
|
UNAME_S := Windows
|
||||||
STATIC_FLAGS = -static-libgcc -static-libstdc++
|
|
||||||
else
|
|
||||||
STATIC_FLAGS =
|
|
||||||
endif
|
endif
|
||||||
|
IS_WINDOWS := $(findstring MSYS,$(UNAME_S))
|
||||||
|
ifneq ($(IS_WINDOWS),)
|
||||||
|
UNAME_S := Windows
|
||||||
|
endif
|
||||||
|
|
||||||
|
CXXFLAGS = -O3 -march=native -std=c++17 -Wall -Wextra -D_USE_MATH_DEFINES
|
||||||
|
|
||||||
# DLL 输出到 engines/release/
|
# DLL 输出到 engines/release/
|
||||||
DLL_DIR = ../../release
|
DLL_DIR = ../../release
|
||||||
@@ -25,8 +28,9 @@ else ifeq ($(UNAME_S),Darwin)
|
|||||||
DLL_TARGET = $(DLL_DIR)/dynamics_cpp.dylib
|
DLL_TARGET = $(DLL_DIR)/dynamics_cpp.dylib
|
||||||
DLL_FLAGS = -dynamiclib
|
DLL_FLAGS = -dynamiclib
|
||||||
else
|
else
|
||||||
|
# Windows: 完全静态链接,避免依赖运行时 DLL
|
||||||
DLL_TARGET = $(DLL_DIR)/dynamics_cpp.dll
|
DLL_TARGET = $(DLL_DIR)/dynamics_cpp.dll
|
||||||
DLL_FLAGS = -shared
|
DLL_FLAGS = -shared -static
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: all dll clean
|
.PHONY: all dll clean
|
||||||
@@ -36,7 +40,7 @@ all: dll
|
|||||||
dll: $(DLL_TARGET)
|
dll: $(DLL_TARGET)
|
||||||
|
|
||||||
$(DLL_TARGET): $(LIB_SRC) | $(DLL_DIR)
|
$(DLL_TARGET): $(LIB_SRC) | $(DLL_DIR)
|
||||||
$(CXX) $(CXXFLAGS) $(STATIC_FLAGS) $(DLL_FLAGS) -o $@ $(LIB_SRC)
|
$(CXX) $(CXXFLAGS) $(DLL_FLAGS) -o $@ $(LIB_SRC)
|
||||||
@echo " === C++ DLL built: $@ ==="
|
@echo " === C++ DLL built: $@ ==="
|
||||||
|
|
||||||
$(DLL_DIR):
|
$(DLL_DIR):
|
||||||
|
|||||||
@@ -7,10 +7,14 @@ LIB_SRC = dynamics_lib.f90
|
|||||||
|
|
||||||
UNAME_S := $(shell uname -s 2>/dev/null || echo Windows)
|
UNAME_S := $(shell uname -s 2>/dev/null || echo Windows)
|
||||||
|
|
||||||
ifeq ($(UNAME_S),Windows)
|
# Windows 检测:Msys2/MINGW 也视为 Windows
|
||||||
STATIC_FLAGS = -static
|
IS_WINDOWS := $(findstring MINGW,$(UNAME_S))
|
||||||
else
|
ifneq ($(IS_WINDOWS),)
|
||||||
STATIC_FLAGS =
|
UNAME_S := Windows
|
||||||
|
endif
|
||||||
|
IS_WINDOWS := $(findstring MSYS,$(UNAME_S))
|
||||||
|
ifneq ($(IS_WINDOWS),)
|
||||||
|
UNAME_S := Windows
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# DLL 输出到 engines/release/
|
# DLL 输出到 engines/release/
|
||||||
@@ -23,8 +27,9 @@ else ifeq ($(UNAME_S),Darwin)
|
|||||||
DLL_TARGET = $(DLL_DIR)/dynamics_f90.dylib
|
DLL_TARGET = $(DLL_DIR)/dynamics_f90.dylib
|
||||||
DLL_FLAGS = -dynamiclib
|
DLL_FLAGS = -dynamiclib
|
||||||
else
|
else
|
||||||
|
# Windows: 完全静态链接,避免依赖 libgfortran-5.dll
|
||||||
DLL_TARGET = $(DLL_DIR)/dynamics_f90.dll
|
DLL_TARGET = $(DLL_DIR)/dynamics_f90.dll
|
||||||
DLL_FLAGS = -shared -fPIC
|
DLL_FLAGS = -shared -fPIC -static
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: all dll clean
|
.PHONY: all dll clean
|
||||||
@@ -34,7 +39,7 @@ all: dll
|
|||||||
dll: $(DLL_TARGET)
|
dll: $(DLL_TARGET)
|
||||||
|
|
||||||
$(DLL_TARGET): $(LIB_SRC) | $(DLL_DIR)
|
$(DLL_TARGET): $(LIB_SRC) | $(DLL_DIR)
|
||||||
$(FC) $(FFLAGS) $(STATIC_FLAGS) $(DLL_FLAGS) -o $@ $(LIB_SRC)
|
$(FC) $(FFLAGS) $(DLL_FLAGS) -o $@ $(LIB_SRC)
|
||||||
@echo " === Fortran DLL built: $@ ==="
|
@echo " === Fortran DLL built: $@ ==="
|
||||||
|
|
||||||
$(DLL_DIR):
|
$(DLL_DIR):
|
||||||
|
|||||||
Reference in New Issue
Block a user