C++ 在Windows上与QtCreator和CMake链接问题

C++ 在Windows上与QtCreator和CMake链接问题,c++,windows,cmake,qt-creator,C++,Windows,Cmake,Qt Creator,我是QtCreator和CMake的新手,我不明白为什么下面的设置会给我一个“未解析的外部符号” 我错过了什么 编辑: @ixSci的Find_软件包(opengl)就在那里,但我想它是不需要的。。这是我现在拥有的更干净的cmakelists: project(test) cmake_minimum_required(VERSION 2.8) aux_source_directory(. SRC_LIST) include_directories(../../glfw/glfw-2.7.7

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

我错过了什么

编辑:

@ixSci的Find_软件包(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)

谢谢。

看来GLFW是OpenGL的开源库。因此,您试图使用
find\u包(opengl)
来查找它,但它是错误的。GLFW不是OpenGL的一部分。您需要应用一些其他方法,例如为cmake下载一些第三部分GLFW finder。我找到了。您需要下载它,存储在某个地方(例如,在您的源代码树中),然后将此路径添加到cmake
集(cmake\u模块\u路径${cmake\u模块\u路径}“您的路径在这里”)
在您的cmake文件顶部。
完成后,您可以使用bash建议的
目标链接库中的
查找包(需要GLFW)
并使用
${GLFW\u库}

target_link_libraries(${PROJECT_NAME} glfwdll)
target_link_libraries(${PROJECT_NAME} glfw)
但我有一个错误:

正在启动E:\opengl\test\test.exe。。。 程序意外地完成了。 E:\opengl\test\test.exe已退出,代码为-1073741515

因此,我尝试使用:

target_link_libraries(${PROJECT_NAME} glfwdll)
target_link_libraries(${PROJECT_NAME} glfw)
但是这次我删除了
#define GLFW_DLL
,它成功了

不知道为什么

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


谢谢大家。

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

当您使用
target\u link\u库(${PROJECT\u NAME}glfwdll)
时,您使用的是动态链接,即针对库的dll版本进行链接。在这种情况下,您应该将GLFW.dll文件与生成的可执行文件放在同一文件夹中,以便能够运行程序。使用库的dll版本似乎还需要定义标志
GLFW_dll
。最好在CMake中使用
add_definitions(-DGLFW_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)
静态链接更容易处理,只需使用
target\u link\u库(${PROJECT\u NAME}glfw)
。您不需要文件
GLFWDLL.lib
GLFW.dll

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

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

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

希望有帮助!以上所有代码都未经测试:-)

是否包含所有库并链接到它们?嗯。。我也这么想。我不是在使用link_目录和target_link_库时这样做的吗?还是还缺什么?好吧,先试试。您使用的是什么IDE?是否尝试重新生成项目?如果已定义GLFW,请尝试与gldwdll链接_DLL@Rui你链接到glfwdll.lib了吗?是的,这是在CMake项目中使用第三方库的推荐方法。但是Rui使用的方法也应该有效。我可以让静态链接正常工作,但我仍然很难使用动态库:S。尽管如此,我还是一直遇到“退出代码-1073741515”错误。你是否将GLFW.dll复制到生成可执行文件的目录?啊。。成功了。谢谢