【问题标题】:Makefile error - File not found - *.cppMakefile 错误 - 找不到文件 - *.cpp
【发布时间】:2018-02-04 06:25:55
【问题描述】:

所以,我尝试在用 c++ 制作的个人 GameEngine 中编译游戏。我使用 makefile 来编译所有文件。在 Linux 上编译很好,但在 Windows 上,使用 MinGW,我得到了这些错误:

C:\Users\Utilisateur\Desktop\Code\GitProjects\HyperGameEngine>make
sh.exe
process_begin: CreateProcess(NULL, uname -s, ...) failed.
File not found - *.cpp
File not found - -TYPE
File not found - D
process_begin: CreateProcess(NULL, uname -s, ...) failed.
process_begin: CreateProcess(NULL, uname -s, ...) failed.
g++  -o "/build"/a.exe  -I"./inc/lua/" -I"inc" -I"./inc/" -I"./inc/SDL2/" -
L"lib/Windows" -static -static-libstdc++ -static-libgcc -std=c++14 -std=gnu++14 
-Wunused-parameter -Wstrict-aliasing -lSDL2main -lSDL2 -lSDL2_net -mwindows -
lglew32s -llibSOIL -lopenal32 -lopengl32 -lBox2D -lfreetype -llua53 -dl
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: cannot 
open output file /build/a.exe: No such file or directory
collect2.exe: error: ld returned 1 exit status
make: *** ["/build"/a.exe] Erreur 1

这里是生成文件:

#TODO Authoritive Server, Basic Server Browser (Hearthbeat to web server)? (maybe steam support)?
#
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

$(info $(SHELL))
ifeq ($(shell uname -s), Linux)
TARGET_EXEC ?= a.out
endif
ifeq ($(OS),Windows_NT)
TARGET_EXEC ?= a.exe
endif

BUILD_DIR ?= "$(CURRENT_DIRECTORY)/build"
SRC_DIRS ?= "$(CURRENT_DIRECTORY)/src" # src or Server

#QMAKE_CXXFLAGS += -std=c++11

SRCS := $(shell find $(SRC_DIRS) -name *.cpp -or -name *.c -or -name *.s)
OBJS := $(SRCS:%=$(BUILD_DIR)/%.o)
DEPS := $(OBJS:.o=.d)

INC_DIRS := $(shell find $(SRC_DIRS) -type d)
INC_FLAGS := $(addprefix -I,$(INC_DIRS))

ifeq ($(shell uname -s), Linux)
CPPFLAGS ?= $(INC_FLAGS) -std=c++14 -MMD -MP -g -Wall -Wextra -O3 -fpermissive #-Werror
endif
ifeq ($(OS),Windows_NT)
CPPFLAGS ?= $(INC_FLAGS) -lmingw32 -std=c++14 -MMD -MP -g -Wall -Wextra -O3 -fpermissive -mwindows #-Werror
endif

 #LINKER_FLAGS specifies the libraries we're linking against -L/usr/lib/nvidia-375/ -I./inc/ -w -lGLEW -lGL -lSLD2
ifeq ($(shell uname -s), Linux)
LINKER_FLAGS = -I./inc/ -I./inc/lua/ -L./lib/Linux/ -lSDL2 -lGLEW -lGL -lSOIL -lopenal -lBox2D -lSDL_net -llua53 -lfreetype -ldl
endif
ifeq ($(OS),Windows_NT)
LINKER_FLAGS = -dl # -I"./inc/lua/" -I"inc" -I"./inc/" -I"./inc/SDL2/" -L"lib/Windows" -static -static-libstdc++ -static-libgcc -std=c++14 -std=gnu++14 -Wunused-parameter -Wstrict-aliasing -lSDL2main -lSDL2 -lSDL2_net -mwindows -lglew32s -llibSOIL -lopenal32 -lopengl32 -lBox2D -lfreetype -llua53 -dl #-I"./inc/steam/" -lsteam_api #-llua53 -dl
endif

$(BUILD_DIR)/$(TARGET_EXEC): $(OBJS)
    g++ $(OBJS) -o $@ $(LDFLAGS) $(LINKER_FLAGS)

# assembly
$(BUILD_DIR)/%.s.o: %.s
    $(MKDIR_P) $(dir $@)
    $(AS) $(ASFLAGS) $(LINKER_FLAGS) -c $< -o $@

# c source
$(BUILD_DIR)/%.c.o: %.c
    $(MKDIR_P) $(dir $@)
    g++ -std=c++0x $(CPPFLAGS) $(CFLAGS) $(LINKER_FLAGS) -c $< -o $@

# c++ source
$(BUILD_DIR)/%.cpp.o: %.cpp
    $(MKDIR_P) $(dir $@)
    g++ $(CPPFLAGS) $(CXXFLAGS) $(LINKER_FLAGS) -c $< -o $@


.PHONY: clean

clean:
    $(RM) -r $(BUILD_DIR)/$(SRC_DIRS)

-include $(DEPS)

MKDIR_P ?= mkdir -p

然后,所有库都在 Linux 上运行,我尝试重新安装 MinGW,但没有任何改变。 makefile 中的一些更改起到了作用。更改 Windows 部分中 LinkerFlags 的顺序是小的错误消息。

【问题讨论】:

  • 我猜,File not found - *.cpp 是后续错误。实际错误可能是process_begin: CreateProcess(NULL, uname -s, ...) failed. 我会检查所有孤立的MinGW 构建工具(例如,g++ 在直接调用时是否有效,make 在规则仅触发时有效echos、cps 或@987654329 @s 等)
  • 如果你想在 Windows 上使用像 uname 这样的 Linux 命令,你需要使用 MSYS 或 Cygwin 之类的东西。更好的解决方案是使用 make 的内置变量 MAKE_HOST

标签: c++ linux windows makefile mingw


【解决方案1】:

也许问题不在于 MinGW.. 据我了解,MinGW 是一组编译器。所以,gcc 和 g++。

MinGW 包括:

GNU 编译器集合 (GCC) 的一个端口,包括 C、C++、ADA
和 Fortran 编译器;

适用于 Windows 的 GNU Binutils(汇编器、链接器、 档案管理器);

一个命令行安装程序,带有可选的 GUI 前端,(mingw-get) 用于在 MS-Windows 上部署 MinGW 和 MSYS;

一个 GUI 首次设置工具 (mingw-get-setup),让您启动并运行 用mingw-get。 http://www.mingw.org/

如果您能够在单个“hello world”文件上运行 g++ 并获得一个 exe,则 MinGW 应该可以工作。

所以,似乎大多数 MinGW 和 gnuwin32 都不是问题! 正如 user657267 指出的那样,您不能在 Windows 上使用 Linux 命令。 这就是说,这并不意味着它是不可能的,只是默认情况下不存在。 “制作”这项工作的一种方法是安装 Git (https://git-scm.com/download/win) 您可以选择所有默认选项... 安装后,转到安装路径并将 bin 文件夹的路径传递到路径环境变量。 这是screenshot of my Environment Variables

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多