Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';我不能正确链接opengl库吗?(Windows、mingw、命令行)_C++_Opengl_Mingw_Static Libraries_Static Linking - Fatal编程技术网

C++ 为什么可以';我不能正确链接opengl库吗?(Windows、mingw、命令行)

C++ 为什么可以';我不能正确链接opengl库吗?(Windows、mingw、命令行),c++,opengl,mingw,static-libraries,static-linking,C++,Opengl,Mingw,Static Libraries,Static Linking,所以基本上我想做的是,在没有VS的windows pc上设置opengl。这是一件痛苦的事,因为这个星球上的每一个该死的教程都使用Visual Studio,但我只是讨厌它,所以我不会使用它。 我所做的是下载所有必要的库,设置一个项目,创建一个主文件,而不是一个Makefile。 main.cpp: #定义FREEGLUT#u静态 #包括 #包括 int main(int argc,字符**argv){ glutInit(&argc,argv); “你好”; glutInitWindowSize

所以基本上我想做的是,在没有VS的windows pc上设置opengl。这是一件痛苦的事,因为这个星球上的每一个该死的教程都使用Visual Studio,但我只是讨厌它,所以我不会使用它。 我所做的是下载所有必要的库,设置一个项目,创建一个主文件,而不是一个Makefile。 main.cpp:

#定义FREEGLUT#u静态
#包括
#包括
int main(int argc,字符**argv){
glutInit(&argc,argv);
“你好”;
glutInitWindowSize(400400);
glutMainLoop();
返回0;
}
我的生成文件:

INCL_DIR = include
SRC_DIR = src
LIB_DIR = lib
BUILD_DIR = build
OUTPUT_NAME = graph.exe

CXX = g++
CXXFLAGS = -I$(INCL_DIR) 
LDFLAGS = -L$(LIB_DIR) -lfreeglut -lglew32 -lopengl32 -lgdi32 -lwinmm

SRCS := $(wildcard $(SRC_DIR)/*.cpp)
OBJS := $(SRCS:%.cpp=%.o)

$(OUTPUT_NAME): $(OBJS)
    $(CXX) -o $(BUILD_DIR)/$(OUTPUT_NAME) $(OBJS) $(CXXFLAGS)

clean:
    del /f $(SRC_DIR)\*.o
    del /f $(BUILD_DIR)\$(OUTPUT_NAME)
项目层次结构:

当我运行make时会发生什么:

PS C:\programming\projects\opengl\u base>make
g++-Iinclude-c-osrc/main.osrc/main.cpp
g++-o build/graph.exe src/main.o-Iinclude
src/main.o:main.cpp:(.text+0x23):对“\uu glutInitWithExit”的未定义引用
src/main.o:main.cpp:(.text+0x46):未定义对“\uu glutCreateWindowWithExit”的引用
src/main.o:main.cpp:(.text+0x68):未定义对“\uu glutCreateMenuWithExit”的引用
src/main.o:main.cpp:(.text+0xad):对“GLUTINITWindowsSize”的未定义引用
src/main.o:main.cpp:(.text+0xb2):对“glutMainLoop”的未定义引用
collect2.exe:错误:ld返回了1个退出状态
生成:**[graph.exe]错误1

我的理解是,这些库由于某种原因根本无法链接。但是为什么呢?请帮助我

因此,对于稍后遇到此问题的任何人:无论何时尝试链接更多库,并且它们相互依赖,请稍微弄乱它们的顺序。

链接exe文件的行具有编译器标志,而不是链接器标志init。 要在
Makefile
change中修复此问题,请执行以下操作:

        $(CXX) -o $(BUILD_DIR)/$(OUTPUT_NAME) $(OBJS) $(CXXFLAGS)
致:


首先,
-L..
-L..
不属于
cxflags
,在编译时(但在链接时)会被默默忽略。通常,您有一个名为
LDFLAGS
的单独变量,用于在链接时替代
cxflags
。接下来,谷歌搜索显示
\uu imp\u timeBeginPeriod
来自“winmm”库,因此添加
-lwinmm
。接下来,
\uuuuu imp\u glPushAttrib
来自
-lopengl32
(因为您已经有了它,它可能相对于其他
-l..
标志的位置不正确,请尝试将其移到末尾)。@HolyBlackCat感谢您的回答。我已经像你说的那样编辑了所有内容,看起来好多了。现在,当我试图操纵别人的CLion项目时,我处于一种我已经达到的状态。(至少现在我为自己能从零开始做到这一点感到自豪)@HolyBlackCat Nvm我很愚蠢,我没有正确更新生成文件。现在它编译并运行。谢谢是的,您向链接器指定它们的顺序很重要。回到“旧”时代,你有时甚至不得不把它们放在链接器上好几次。尝试切换到LLVM的
lld
或GNU
gold
链接器。
        $(CXX) -o $(BUILD_DIR)/$(OUTPUT_NAME) $(OBJS) $(LDFLAGS)