在Windows上将问题与QtCreator和CMake联系起来

时间:2013-02-25 09:47:55

标签: c++ windows cmake qt-creator

我是QtCreator和CMake的新手,我无法理解为什么以下设置会给我一个“未解析的外部符号”。

enter image description here

我错过了什么?

修改

@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)

感谢。

3 个答案:

答案 0 :(得分:0)

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

中使用target_link_libraries

答案 1 :(得分: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,以及为什么我无法使用它,那就太棒了。

谢谢大家。

答案 2 :(得分:0)

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

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

静态链接更容易处理,只需使用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)

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