尽管netbeans在代码完成中显示了函数,但未定义引用
Undefined reference despite netbeans showing function in code-completion
我是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中。
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 类 Referention 中C++回调函数引用非静态函数
- 使用函数引用指向节点的指针删除链表中的节点?
- 解释通过从函数引用返回数组的语法
- "Class1"类"Class2"对象作为私有数据成员。如何通过"Class 2"函数引用"Class1"对象?
- 使用默认构造函数引用成员变量初始化错误
- 无法调用函数引用 c++
- 使用 decltype(this) 获取函数引用
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 从内联函数引用文件静态变量
- Boost::将sigaction函数引用绑定到实例
- 一种比函数引用更有效的方法
- 奇怪的未定义函数引用,函数调用C++不存在
- 是否可以检测绑定成员函数引用的对象是否被删除或销毁
- 构造函数引用参数导致seg错误
- 是否可以使函数模板从函数引用中获取“decltype”
- 无法让 Lua 函数引用"self"
- 如何解析变量和函数引用(Linker & Compiler)?
- 从不同模块调用函数 - 引用错误
- 如何在主函数中连接到数据库,然后从其他函数引用它