尽管netbeans在代码完成中显示了函数,但未定义引用

Undefined reference despite netbeans showing function in code-completion

本文关键字:函数 引用 未定义 显示 netbeans 代码 尽管      更新时间:2023-10-16

我是c++的新手,但我在其他编程语言中有一些编程经验,所以阅读c++代码只需在谷歌上搜索一下是没有问题的。

对于一个uni项目,我需要写一个游戏,我们应该使用他们的一个库,名为ACGL。我们也使用GLFW,它似乎工作得很好。(我将GLFW二进制文件的正确文件复制到C:\MinGW\include和C:\MinGW\lib,并将.dll添加到main.cpp所在的文件夹中)

我正在使用MinGW和Netbeans 8.0.1 for Windows 7 32位。我下载了ACGL,并将文件夹放在C:\MinGW\include中的include文件夹中。

现在我的主程序中有一些代码。cpp:

//#define ACGL_OPENGL_VERSION_32
//#define ACGL_OPENGL_PROFILE_CORE
#include <ACGL/ACGL.hh>
//#include <ACGL/OpenGL/GL.hh>
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
static void error_callback(int error, const char* description) {
    fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}
int main(void) {
    GLFWwindow* window;
    glfwSetErrorCallback(error_callback);
    if (!glfwInit())
        exit(EXIT_FAILURE);
    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
    if (!window || !(ACGL::init(true))) {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }
    glfwMakeContextCurrent(window);
    glfwSetKeyCallback(window, key_callback);
    while (!glfwWindowShouldClose(window)) {
        float ratio;
        int width, height;
        glfwGetFramebufferSize(window, &width, &height);
        ratio = width / (float) height;
        glViewport(0, 0, width, height);
        glClear(GL_COLOR_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f);
        glBegin(GL_TRIANGLES);
        glColor3f(1.f, 0.f, 0.f);
        glVertex3f(-0.6f, -0.4f, 0.f);
        glColor3f(0.f, 1.f, 0.f);
        glVertex3f(0.6f, -0.4f, 0.f);
        glColor3f(0.f, 0.f, 1.f);
        glVertex3f(0.f, 0.6f, 0.f);
        glEnd();
        glfwSwapBuffers(window);
        glfwPollEvents();
    }
    glfwDestroyWindow(window);
    glfwTerminate();
    exit(EXIT_SUCCESS);
}

从本质上讲,GLFW示例(运行良好的btw)的ACGL包含在顶部,ACGL::init()函数位于正确的位置。

一切似乎都很好,Netbeans能够找到(Ctrl-Click),并且它还在相应的ACGL.cc(CtrlClick)中找到init函数

然而,当我尝试用Netbeans编译项目时,会出现以下错误:

"/C/MinGW/MSYS/1.0/bin/make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .clean-conf
make.exe[1]: Entering directory `/c/Users/Tarek/Desktop/Netbeans Workspace/swpp-ws-14-15-a/MarbleGame'
rm -f -r build/Debug
rm -f dist/Debug/MinGW-Windows/marblegame.exe
make.exe[1]: Leaving directory `/c/Users/Tarek/Desktop/Netbeans Workspace/swpp-ws-14-15-a/MarbleGame'
CLEAN SUCCESSFUL (total time: 2s)
"/C/MinGW/MSYS/1.0/bin/make.exe" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make.exe[1]: Entering directory `/c/Users/Tarek/Desktop/Netbeans Workspace/swpp-ws-14-15-a/MarbleGame'
"/C/MinGW/MSYS/1.0/bin/make.exe"  -f nbproject/Makefile-Debug.mk dist/Debug/MinGW-Windows/marblegame.exe
make.exe[2]: Entering directory `/c/Users/Tarek/Desktop/Netbeans Workspace/swpp-ws-14-15-a/MarbleGame'
mkdir -p build/Debug/MinGW-Windows
rm -f "build/Debug/MinGW-Windows/main.o.d"
g++    -c -g -MMD -MP -MF "build/Debug/MinGW-Windows/main.o.d" -o build/Debug/MinGW-Windows/main.o main.cpp
mkdir -p dist/Debug/MinGW-Windows
g++     -o dist/Debug/MinGW-Windows/marblegame build/Debug/MinGW-Windows/main.o -lglfw3dll -lopengl32
build/Debug/MinGW-Windows/main.o: In function `main':
C:UsersTarekDesktopNetbeans Workspaceswpp-ws-14-15-aMarbleGame/main.cpp:24: undefined reference to `ACGL::init(bool)'
collect2.exe: error: ld returned 1 exit status
make.exe[2]: *** [dist/Debug/MinGW-Windows/marblegame.exe] Error 1
make.exe[2]: Leaving directory `/c/Users/Tarek/Desktop/Netbeans Workspace/swpp-ws-14-15-a/MarbleGame'
make.exe[1]: *** [.build-conf] Error 2
make.exe[1]: Leaving directory `/c/Users/Tarek/Desktop/Netbeans Workspace/swpp-ws-14-15-a/MarbleGame'
make.exe": *** [.build-impl] Error 2
BUILD FAILED (exit value 2, total time: 4s)

怎么可能,Netbeans找到了引用,而编译器没有?我没有任何.a文件要复制到C:\MinGW\lib,所以我不知道我是否必须用另一种方式为编译器链接东西?init函数是在一个名为"ACGL"的命名空间中定义的,但我调用ACGL::init(),所以这也不会是个问题,对吧?我在这里没看到什么?

如果你需要任何其他东西(除了ACGL的代码-我认为我们不被允许分享),请发表评论,我会尽力提供。

谢谢你的帮助。

我有我的大学提供的源代码和一个CMakeLists.txt,所以我使用cmake为MSYS生成一个makefile,并用make重新编译,生成对象文件和库,这些文件和库可以放在C:\MinGW\lib中。