使用g ++在Windows上使用glfw3进行未定义的引用

时间:2017-12-12 22:23:56

标签: c++ makefile mingw glfw undefined-reference

我正在尝试为this tutorial创建一个opengl项目,但我无法编译我的程序。

目前的问题是每个glfw函数都是未定义的,但它们存在于glfw3.h中。

glfw3文件来自the glfw download page(x64版本)。

以下是日志的副本:

make
=== SRC ===
src/glad.c src/main.cpp
=== OBJ ===
bin/glad.o bin/main.o
===== Creating file bin/glad.o ===
C:/cygnus/cygwin-b20/H-i586-cygwin32/bin/mkdir -p bin/
C:/MinGW/bin/g++ -I./include -o bin/glad.o -c src/glad.c
===== Creating file bin/main.o ===
C:/cygnus/cygwin-b20/H-i586-cygwin32/bin/mkdir -p bin/
C:/MinGW/bin/g++ -I./include -o bin/main.o -c src/main.cpp
C:/MinGW/bin/g++  -L./libs -o build/program.exe bin/glad.o bin/main.o -lglfw3
bin/main.o:main.cpp:(.text+0xc): undefined reference to `glfwInit'
collect2.exe: error: ld returned 1 exit status
make: *** [program.exe] Erreur 1

我使用以下main.cpp文件:

#include <glad/glad.h>
#include <GLFW/glfw3.h>

#include <iostream>

int main(int argc, char** argv){

    glfwInit();

    return 0;
}

以下makefile:

CXX = C:/MinGW/bin/g++
FAKEPATH = C:/cygnus/cygwin-b20/H-i586-cygwin32/bin/

CXXFLAGS  = -W -Wall -ansi -Wno-deprecated
LDLIBS = -lglfw3

TARGET  = program.exe

LIB_DIR = -L./libs
INC_DIR = -I./include

SRC = $(shell $(FAKEPATH)find src/ -type f \( -iname \*.cpp -o -iname \*.c \))
OBJ = $(patsubst src/%,bin/%,$(addsuffix .o, $(basename $(SRC))))


all: directories $(TARGET)

test:
    echo $(FAKEPATHEXISTS)

directories:
    @$(FAKEPATH)echo === SRC ===
    @$(FAKEPATH)echo $(SRC)
    @$(FAKEPATH)echo === OBJ ===
    @$(FAKEPATH)echo $(OBJ)
    @$(FAKEPATH)mkdir -p bin
    @$(FAKEPATH)mkdir -p build

compileAndRun: all
    build/$(TARGET)

$(TARGET): $(OBJ)
    $(CXX) $(LDFLAGS) $(LIB_DIR) -o build/$@ $^ $(LDLIBS)

bin/%.o: src/%.c
    @$(FAKEPATH)echo ===== Creating file $@ ===
    $(FAKEPATH)mkdir -p $(dir $@)
    $(CXX) $(INC_DIR) -o $@ -c $<

bin/%.o: src/%.cpp
    @$(FAKEPATH)echo ===== Creating file $@ ===
    $(FAKEPATH)mkdir -p $(dir $@)
    $(CXX) $(INC_DIR) -o $@ -c $<

clean:
    @$(FAKEPATH)rm -rf bin/

cleaner: clean
    @$(FAKEPATH)rm -rf build/

最后,我的文件排序如下:

files

我使用MinGW代替g ++,使用cygwin代替linux命令。

任何帮助或尝试都会非常感激! (我真的不知道问题出在哪里) 谢谢!

注意:我已经在google上搜索了很多而没有找到任何可行的解决方案(包括几个堆栈溢出问题)

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。

我要做的第一件事就是在main.cpp中添加 <system.diagnostics> <sources> <source name="System.Net"> <listeners> <add name="System.Net"/> </listeners> </source> <source name="System.Net.Cache"> <listeners> <add name="System.Net"/> </listeners> </source> <source name="System.Net.Http"> <listeners> <add name="System.Net"/> </listeners> </source> <source name="System.Net.Sockets"> <listeners> <add name="System.Net"/> </listeners> </source> <source name="System.Net.WebSockets"> <listeners> <add name="System.Net"/> </listeners> </source> </sources> <switches> <add name="System.Net" value="Verbose"/> <add name="System.Net.Cache" value="Verbose"/> <add name="System.Net.Http" value="Verbose"/> <add name="System.Net.Sockets" value="Verbose"/> <add name="System.Net.WebSockets" value="Verbose"/> </switches> <sharedListeners> <add name="System.Net" type="System.Diagnostics.TextWriterTraceListener" initializeData="network.log" /> </sharedListeners> <trace autoflush="true"/>

执行此操作后,我收到错误#define GLFW_DLL。为了解决这个错误,我不得不删除/ libs中的* .a文件,然后将我的.dll文件移动到项目的根目录(以避免丢失dll错误)。