关于DEV C++和opengl的bug

  1. 6月前

    我用的是dev c++ 5.11,后面的编译程序是gcc4.9.2 64bit,包含mingGW 32和64,不知道用visual studio的是不是也一样。

    问题大概是这样的,如果你想要创建一个控制台project,在其中引用opengl的某些内容,例如gl.h的函数,那么即使你试图创建了个窗口给opengl绘图,即使你明确的include了所有opengl的头文件并在project选项中加入了所有opengl库,你都会得到opengl函数的引用错误(找不到引用对象)。.。如果把project的性质改成窗口应用程序,这个问题立刻会得到解决。在窗口应用程序下的project性质下,把主函数改成main替代winmain,可以正常运行呼出控制台窗口,但是printf和cin、cout就不能正常使用(看起来直接被跳过了)。

    不知道各位有没有遇到过类似的问题。也不知道该给谁反应和怎样解决。我只知道opengl的问题十分普遍:stackflow上面“从古到今”都有许多人问,回答的也很多,但是没有一个说到我这个角度的,提问者也不满意答案。

  2. gcc/g++的参数是怎样的?

  3. @行人一棹天涯 gcc/g++的参数是怎样的?

    你这个问的好,我还真的不知道dev c++从哪里找编译器参数。看起来makefile里面有一些很像。


    # Project: Project1
    # Makefile created by Dev-C++ 5.11

    CPP = g++.exe
    CC = gcc.exe
    WINDRES = windres.exe
    OBJ = main.o
    LINKOBJ = main.o
    LIBS = 略
    INCS = 略
    CXXINCS = 略
    BIN = Project1.exe
    CXXFLAGS = $(CXXINCS)
    CFLAGS = $(INCS)
    RM = rm.exe -f

    .PHONY: all all-before all-after clean clean-custom

    all: all-before $(BIN) all-after

    clean: clean-custom
    ${RM} $ (OBJ) $ (BIN)

    $(BIN): $(OBJ)
    $ (CPP) $ (LINKOBJ) -o $(BIN) $(LIBS)

    main.o: main.cpp
    $(CPP) -c main.cpp -o main.o $(CXXFLAGS)

  4. @丁香丛中的雪狼 你这个问的好,我还真的不知道dev c++从哪里找编译器参数。看起来makefile里面有一些很像。


    # Project: Project1
    # Makefile created by Dev-C++ 5.11

    CPP = g++.exe
    CC = gcc.exe
    WINDRES = windres.exe
    OBJ = main.o
    LINKOBJ = main.o
    LIBS = 略
    INCS = 略
    CXXINCS = 略
    BIN = Project1.exe
    CXXFLAGS = $(CXXINCS)
    CFLAGS = $(INCS)
    RM = rm.exe -f

    .PHONY: all all-before all-after clean clean-custom

    all: all-before $(BIN) all-after

    clean: clean-custom
    ${RM} $ (OBJ) $ (BIN)

    $(BIN): $(OBJ)
    $ (CPP) $ (LINKOBJ) -o $(BIN) $(LIBS)

    main.o: main.cpp
    $(CPP) -c main.cpp -o main.o $(CXXFLAGS)

    问题很可能就出在被略去的LIBS、INCS和CXXINCS。

  5. @行人一棹天涯 问题很可能就出在被略去的LIBS、INCS和CXXINCS。

    LIBS = -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -mwindows -lopengl32

    INCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"

    CXXINCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"


    不知道这里面是不是还少什么?

  6. @丁香丛中的雪狼 LIBS = -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -mwindows -lopengl32

    INCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"

    CXXINCS = -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"D:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"


    不知道这里面是不是还少什么?

    这是窗口应用程序的编译参数吧。我记得在Windows下,窗口应用程序直接向stdout等输出,在控制台里是看不到的。这是Windows本身的问题,要想在窗口应用程序中向控制台输出,只有两种办法:用AllocConsole新打开一个控制台;在控制台运行程序时用管道操作符接收程序的输出。

  7. @行人一棹天涯 这是窗口应用程序的编译参数吧。我记得在Windows下,窗口应用程序直接向stdout等输出,在控制台里是看不到的。这是Windows本身的问题,要想在窗口应用程序中向控制台输出,只有两种办法:用AllocConsole新打开一个控制台;在控制台运行程序时用管道操作符接收程序的输出。

    这到底要怎么看来着??我实在不明白啊。。。
    而且不明白你在指什么东西。是编译时的输出吗?

  8. @丁香丛中的雪狼 这到底要怎么看来着??我实在不明白啊。。。
    而且不明白你在指什么东西。是编译时的输出吗?

    关键就在编译参数里那个-mwindows。Windows下,用这个参数链接的程序向控制台的输出不会被显示出来。

  9. @行人一棹天涯 关键就在编译参数里那个-mwindows。Windows下,用这个参数链接的程序向控制台的输出不会被显示出来。

    因此把这个去了,就可以使用cin、cout和printf?可是去掉了以后,我神奇的发现三个负责窗口的函数:swapbuffers,choosepixelformat和setpixelformat不能使用了,这三个都是wingdi里的函数。
    还有你说输出不会被显示,但是输入也被忽略又是为什么呢?输入也检测不出来。如果创建一个int变量=cin,那么这个变量的值还是0.

  10. 8102年了,为啥要用这类古董……(如果用IDE,请确保IDE能以足够傻瓜化为卖点而不是把你拐到坑里;或者你应该清楚常见问题的分析套路。)
    -mwindows指定链接使用Win32子系统,启动程序时不会脑补一个控制台出来(进一步细节我在这里 有提,搜-mwindows)。至于标准输入输出流,那应该没有影响,只是到控制台的关联的默认逻辑被干掉了,简单情况就是重定向代替。如果你还要控制台就得用控制台API,比较麻烦,不建议这样搞。
    GDI不能使用了……不清楚具体症状和你怎么拿到的DC怎么用的问题,暂不评论。

  11. 我用 Visual Studio Code (不是 Visual Stuido) 后
    装好自己的环境并且path好
    我把所有的编辑器和IDE都删了

    强烈安利 VScode

  12. @幻の上帝 8102年了,为啥要用这类古董……(如果用IDE,请确保IDE能以足够傻瓜化为卖点而不是把你拐到坑里;或者你应该清楚常见问题的分析套路。)
    -mwindows指定链接使用Win32子系统,启动程序时不会脑补一个控制台出来(进一步细节我在这里 有提,搜-mwindows)。至于标准输入输出流,那应该没有影响,只是到控制台的关联的默认逻辑被干掉了,简单情况就是重定向代替。如果你还要控制台就得用控制台API,比较麻烦,不建议这样搞。
    GDI不能使用了……不清楚具体症状和你怎么拿到的DC怎么用的问题,暂不评论。

    你说的很有道理。那么:

    1. 我如果想要控制台可以开启opengl窗口,应该如何设置?
    2. 实测使用控制台api在窗口应用程序的选项里可以使用。

    说GDI不能使用,因为我看到了swapbuffer,因此是不是因为去掉了-mwindows所以所有涉及窗口的都不能使用了吗?

  13. @ConAntares 我用 Visual Studio Code (不是 Visual Stuido) 后
    装好自己的环境并且path好
    我把所有的编辑器和IDE都删了

    强烈安利 VScode

    你说的有道理。但是我想要一个空间占用非常小、系统资源消耗非常少的玩意儿。

  14. 你还是把“不能用GDI”时的编译参数发出来吧。

  15. @行人一棹天涯 你还是把“不能用GDI”时的编译参数发出来吧。

    抱歉我有别的事耽误了两个星期,因此项目的makefile找不到了。。。这贴留着,,下一回如果再遇到这个问题,我就在这儿继续发了。

 

后才能发言