0

我是 QtCreator 和 CMake 的新手,我不明白为什么下面的设置给了我一个“未解析的外部符号”。

在此处输入图像描述

我错过了什么?

编辑:

@ixSci Find_package(opengl) 在那里,但我想它不需要..这是我现在拥有的更清洁的 cmakelists:

project(test)
cmake_minimum_required(VERSION 2.8)

aux_source_directory(. SRC_LIST)

include_directories(../../glfw/glfw-2.7.7/include)    
link_directories(../../glfw/glfw-2.7.7/lib-msvc110)

add_executable(${PROJECT_NAME} ${SRC_LIST})

target_link_libraries(${PROJECT_NAME} opengl32 glfw)

谢谢。

4

3 回答 3

0

似乎 GLFW 是 OpenGL 的一些开源库。所以你试图通过使用来找到它,find_package(opengl)但它是错误的。GLFW 不是 OpenGL 的一部分。您需要应用一些其他方法,例如为 cmake 下载一些 3rdpart GLFW finder。我找到的一个。您需要下载它,存储在某处(例如在您的源代码树中),然后将此路径添加到SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "YOUR_PATH_GOES_HERE")cmake 文件顶部的 cmake。完成后,您可以使用FIND_PACKAGE(GLFW REQUIRED)${GLFW_LIBRARY}在您的target_link_libraries

于 2013-02-25T10:29:30.300 回答
0

由 bash.d 建议,我尝试过使用:

target_link_libraries(${PROJECT_NAME} glfwdll)

但我得到了这个错误:

正在启动 E:\opengl\test\test.exe... 程序意外结束。E:\opengl\test\test.exe 以代码 -1073741515 退出

所以我尝试使用:

target_link_libraries(${PROJECT_NAME} glfw)

但是这次我删除了#define GLFW_DLL它并且它起作用了。

不知道为什么。

如果有人可以解释如何正确使用 glfwdll.lib,以及为什么我不能使用它,那就太好了。

谢谢大家。

于 2013-02-27T17:09:02.120 回答
0

看起来您正在混合静态和动态链接。您必须选择使用其中任何一个。

当您使用时,target_link_libraries(${PROJECT_NAME} glfwdll)您正在使用动态链接,即链接到库的 dll 版本。在这种情况下,您应该将 GLFW.dll 文件与构建的可执行文件放在同一文件夹中,以便能够运行该程序。似乎使用库的 dll 版本也需要GLFW_DLL定义标志。最好在 CMake 中使用add_definitions(-DGLFW_DLL)而不是将其放入源文件中来定义它。

静态链接更容易处理,只需使用target_link_libraries(${PROJECT_NAME} glfw). 您不需要文件GLFWDLL.libGLFW.dll.

因此,通过动态链接,您CMakeLists.txt可能如下所示(#define GLFW_DLL从源文件中删除)。

cmake_minimum_required(VERSION 2.8)
project(test)

aux_source_directory(. SRC_LIST)
include_directories(../../glfw/glfw-2.7.7/include)    
link_directories(../../glfw/glfw-2.7.7/lib-msvc110)

add_definitions(-DGLFW_DLL)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} opengl32 glfwdll)

如果您想更改为静态链接,只需将最后三行更改为

#add_definitions(-DGLFW_DLL)
add_executable(${PROJECT_NAME} ${SRC_LIST})
target_link_libraries(${PROJECT_NAME} opengl32 glfw)

希望能帮助到你!上面的所有代码都未经测试:-)

于 2013-02-28T05:53:52.050 回答