From b7d156ea40c67d3456ed6b42784c94cbf278939f Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Tue, 2 Jun 2026 13:17:32 +0300 Subject: [PATCH] Compile rnnoise and libspecbleach directly into obj_win/ for Windows Sub-make of third_party/ reported 'up to date' when Linux ELF objects were present from a prior host build, causing the linker to receive ELF archives instead of PE/COFF and producing undefined reference errors. Fix: compile rnnoise and libspecbleach sources directly into obj_win/ with explicit pattern rules, producing lib_win/librnnoise.a and lib_win/libspecbleach.a. These are fully isolated from third_party/ and never conflict with the Linux build artifacts. Co-Authored-By: Claude Sonnet 4.6 --- Makefile.windows | 85 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 19 deletions(-) diff --git a/Makefile.windows b/Makefile.windows index 196bd01..6574d95 100644 --- a/Makefile.windows +++ b/Makefile.windows @@ -82,17 +82,62 @@ SOURCES = \ OBJS := $(addprefix $(OBJDIR)/, $(SOURCES:.c=.o)) +# ── NR3/NR4: исходники third-party ──────────────────────────────────────────── +# +# Компилируем rnnoise и libspecbleach напрямую в obj_win/, минуя их sub-make. +# Это исключает конфликт с Linux-сборкой: third_party/*.a содержат ELF-объекты, +# и если они "свежее" исходников, sub-make считает их up-to-date и не пересобирает. + +RNNOISE_DIR := third_party/rnnoise +SPECBLEACH_DIR := third_party/libspecbleach + +RNNOISE_SRCS := \ + src/denoise.c src/celt_lpc.c src/kiss_fft.c src/nnet.c \ + src/nnet_default.c src/parse_lpcnet_weights.c src/pitch.c \ + src/rnn.c src/rnnoise_data.c \ + src/rnnoise_data_1.c src/rnnoise_data_2.c src/rnnoise_data_3.c \ + src/rnnoise_data_4.c src/rnnoise_data_5.c src/rnnoise_data_6.c \ + src/rnnoise_tables.c + +SPECBLEACH_SRCS := \ + src/processors/specbleach_adenoiser.c \ + src/processors/specbleach_denoiser.c \ + src/processors/adaptivedenoiser/adaptive_denoiser.c \ + src/shared/gain_estimation/gain_estimators.c \ + src/shared/noise_estimation/adaptive_noise_estimator.c \ + src/shared/pre_estimation/absolute_hearing_thresholds.c \ + src/shared/pre_estimation/critical_bands.c \ + src/shared/pre_estimation/masking_estimator.c \ + src/shared/pre_estimation/noise_scaling_criterias.c \ + src/shared/pre_estimation/spectral_smoother.c \ + src/shared/pre_estimation/transient_detector.c \ + src/shared/post_estimation/noise_floor_manager.c \ + src/shared/post_estimation/postfilter.c \ + src/shared/post_estimation/spectral_whitening.c \ + src/shared/utils/denoise_mixer.c \ + src/shared/utils/general_utils.c \ + src/shared/utils/spectral_features.c \ + src/shared/utils/spectral_utils.c \ + src/shared/stft/stft_processor.c \ + src/shared/stft/fft_transform.c \ + src/shared/stft/stft_buffer.c \ + src/shared/stft/stft_windows.c + +RNNOISE_OBJS := $(addprefix $(OBJDIR)/rnnoise/, $(RNNOISE_SRCS:.c=.o)) +SPECBLEACH_OBJS := $(addprefix $(OBJDIR)/specbleach/, $(SPECBLEACH_SRCS:.c=.o)) + +RNNOISE_LIB := $(OUTDIR)/librnnoise.a +SPECBLEACH_LIB := $(OUTDIR)/libspecbleach.a + # ── Флаги компиляции ────────────────────────────────────────────────────────── -NR34_INC := -I third_party/rnnoise/include -I third_party/libspecbleach/include +NR34_INC := -I$(RNNOISE_DIR)/include -I$(SPECBLEACH_DIR)/include FFTW_INC := -I$(FFTW_INST)/include COMPILE := $(CC) $(CFLAGS) $(FFTW_INC) $(NR34_INC) -NR34_DEPS := third_party/rnnoise/librnnoise.a \ - third_party/libspecbleach/libspecbleach.a +NR34_DEPS := $(RNNOISE_LIB) $(SPECBLEACH_LIB) -# После сборки из исходников import lib называется libfftw3.dll.a → линкуем -lfftw3 # avrt нужен т.к. comm.h включает под _WIN32 LINK_LIBS := $(NR34_DEPS) \ -L$(FFTW_INST)/lib -lfftw3 -lfftw3f \ @@ -177,20 +222,24 @@ $(FFTW_LIB_F): $(FFTW_BUILD_F)/Makefile $(FFTW_LIB_D) third-party: $(NR34_DEPS) -third_party/rnnoise/librnnoise.a: - @echo ">>> Собираем rnnoise для Windows..." - $(MAKE) -C third_party/rnnoise \ - CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \ - CFLAGS="$(CFLAGS) -Iinclude -Isrc" +$(RNNOISE_LIB): $(RNNOISE_OBJS) | $(OUTDIR) + $(AR) rv $@ $^ + $(RANLIB) $@ -# libspecbleach/Makefile жёстко вызывает pkg-config через FFTWINCLUDE=`...` -# и использует результат только в CFLAGS?= — переопределяем CFLAGS целиком, -# чтобы обойти pkg-config и прописать путь к нашему FFTW вручную. -third_party/libspecbleach/libspecbleach.a: $(FFTW_LIB_D) - @echo ">>> Собираем libspecbleach для Windows..." - $(MAKE) -C third_party/libspecbleach \ - CC="$(CC)" AR="$(AR)" RANLIB="$(RANLIB)" \ - CFLAGS="$(CFLAGS) -I$(FFTW_INST)/include -Iinclude -Isrc -Isrc/shared" +$(SPECBLEACH_LIB): $(SPECBLEACH_OBJS) | $(OUTDIR) + $(AR) rv $@ $^ + $(RANLIB) $@ + +# % в GNU make совпадает через '/', поэтому паттерн покрывает вложенные пути +$(OBJDIR)/rnnoise/%.o: $(RNNOISE_DIR)/%.c + @mkdir -p $(@D) + $(CC) $(CFLAGS) -I$(RNNOISE_DIR)/include -I$(RNNOISE_DIR)/src -c -o $@ $< + +$(OBJDIR)/specbleach/%.o: $(SPECBLEACH_DIR)/%.c | $(FFTW_LIB_D) + @mkdir -p $(@D) + $(CC) $(CFLAGS) -I$(FFTW_INST)/include \ + -I$(SPECBLEACH_DIR)/include -I$(SPECBLEACH_DIR)/src -I$(SPECBLEACH_DIR)/src/shared \ + -c -o $@ $< # ── Основная библиотека ─────────────────────────────────────────────────────── @@ -231,8 +280,6 @@ $(OBJDIR)/%.o: %.c | $(OBJDIR) $(FFTW_LIB_D) clean: -rm -rf $(OBJDIR) $(OUTDIR) - -$(MAKE) -C third_party/rnnoise clean - -$(MAKE) -C third_party/libspecbleach clean # distclean удаляет собранный и скачанный FFTW — при следующем запуске пересоберётся distclean: clean