MinGW 在 Windows 上制作
Posted
技术标签:
【中文标题】MinGW 在 Windows 上制作【英文标题】:MinGW make on Windows 【发布时间】:2014-09-29 23:12:06 【问题描述】:我在我的 Windows 8.1 机器上安装了 MinGW,我正在使用它来开发可以移植到 Unix/Linux 系统的 C++ 代码,而不是能够双启动 Ubuntu 或类似系统。
我有一个通用的 makefile,应该可以用于构建项目,但由于某种原因,Windows 上的 find
命令无法找到项目的源文件。我收到此错误:
File not found - *.cpp
Makefile:32: *** mixed implicit and normal rules. Stop.
这是我使用的makefile(我改编自this博客,以及博客中的基本项目结构:
CC := g++ # This is the main compiler
# CC := clang --analyze # and comment out the linker last line for sanity
SRCDIR := src # Directory for source code
BUILDDIR := build # Directory containing all object files, which are removed on "make clean"
TARGET := bin/runner # bin/runner contains the main executable for project
# bin/ contains all other executables in the project (such as tests)
SRCEXT := cpp # File extension of source code
# Look for all the source files in SRCDIR with the file extension specified above
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
# Name all object files the same root name as the source files from which they came, but add a .o extension to the end
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
# The -g flag specifies that debugging information should be produced in the native format of the OS
CFLAGS := -g # -Wall
# Various flags for libraries that might need to be linked
LIB := -pthread -lmongoclient -L lib -lboost_thread-mt -lboost_filesystem-mt -lboost_system-mt
# Ensures that all header files (in the include/ folder) are accessible for build
INC := -I include
# Show the components that are currently being compiled/linked
# Also, this is the main procedure for make: The TARGET is built from the objects, and
# object files are built from source
$(TARGET): $(OBJECTS)
@echo " Linking..."
@echo " $(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB)
$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
@mkdir -p $(BUILDDIR)
@echo " $(CC) $(CFLAGS) $(INC) -c -o $@ $<"; $(CC) $(CFLAGS) $(INC) -c -o $@ $<
# Directives for "make clean" which cleans all object files out of the build/ folder
clean:
@echo " Cleaning...";
@echo " $(RM) -r $(BUILDDIR) $(TARGET)"; $(RM) -r $(BUILDDIR) $(TARGET)
# Tests
# tester:
# $(CC) $(CFLAGS) test/tester.cpp $(INC) $(LIB) -o bin/tester
# Spikes
# ticket:
# $(CC) $(CFLAGS) spikes/ticket.cpp $(INC) $(LIB) -o bin/ticket
# Destroys everything in the build/ and bin/runner/ folders. Does not clean test executables.
.PHONY: clean
如果我在项目的根目录中打开增强型控制台并运行find src/ -name '*.cpp'
,我会收到与上述相同的错误。从根目录运行dir
Windows 命令也找不到 cpp 文件。但是,当从src
目录运行时,dir
可以找到我所有的源文件,而find
不能。这是有原因的吗?
【问题讨论】:
【参考方案1】:Windows 上的 find
命令与 Unix 上的 find find
命令完全不同。它执行的功能更像 Unix 上的grep
。通常,您的 makefile 假定有许多 Unix 实用程序,因此无法在 Windows 上运行,或者至少不能在 Windows 上运行,除非您使用的东西提供了它所期望的所有 Unix 命令。您可以使用 Cygwin 或 MSYS,后者是前者的精简分支。 Cygwin 默认创建 Cygwin 应用程序,而 MSYS 默认创建“本机”Windows 应用程序。
还可以重写 makefile 以使用 Windows 命令。比如:
# Look for all the source files in SRCDIR with the file extension specified above
SOURCES := $(shell dir /b /s $(SRCDIR)\*.$(SRCEXT))
...
$(TARGET): $(OBJECTS)
@echo Linking...
$(CC) $^ -o $(TARGET) $(LIB)
$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
-mkdir $(BUILDDIR)
$(CC) $(CFLAGS) $(INC) -c -o $@ $<
# Directives for "make clean" which cleans all object files out of the build/ folder
clean:
@echo Cleaning...;
-rmdir /s /q $(BUILDDIR)
-del $(TARGET)
使用dir /b /s
的替代方法是仅列出源文件。通常,这比动态生成列表更好。
【讨论】:
【参考方案2】:要在不更改 makefile 的情况下修复最初报告的问题,请执行以下操作
-
转到系统上安装 MinGW 的文件夹
搜索 find.exe
将 find.exe 所在的文件夹添加到系统或用户环境变量中。
不要忘记重新启动或关闭应用程序以使更改生效。
您可以手动测试 find 命令,您可以看到它有效
【讨论】:
以上是关于MinGW 在 Windows 上制作的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 上制作期间未定义 Qt vulkan 类
使用 Mingw 在 Windows 上安装 Linux 库