簡體   English   中英

Visual Studio Community 2017 LNK2019尚未解決的外部符號

[英]Visual studio community 2017 LNK2019 unresolved external symbol

我整天都在四處尋找,但沒有找到解決方法。 我正在使用opengl擴展glew,glfw和glm。 Visual Studio Community 2017引發異常:嚴重級代碼說明項目文件行抑制狀態錯誤LNK2019無法解析的外部符號__imp__glewInit @ 0,在函數_main名稱目錄中引用。

我的項目位於:C:\\ Users \\ timbucktoo \\ Desktop \\ Projects \\ Scape \\ Scape我的擴展位於:C:\\ Users \\ timbucktoo \\ Desktop \\ Projects \\ Scape \\ Scape \\ OpenGL擴展二進制文件\\未壓縮

我添加了c ++ include目錄:C:\\ Users \\ timbucktoo \\ Desktop \\ Projects \\ Scape \\ Scape \\ OpenGL Exetensions Binaries \\ unzipped \\ glm-0.9.8.4%281%29 \\ glm;

C:\\ Users \\ timbucktoo \\ Desktop \\ Projects \\ Scape \\ Scape \\ OpenGL擴展二進制文件\\未壓縮\\ glfw-3.2.1.bin.WIN64 \\ glfw-3.2.1.bin.WIN64 \\ include;

C:\\ Users \\ timbucktoo \\ Desktop \\ Projects \\ Scape \\ Scape \\ OpenGL擴展二進制文件\\未壓縮\\ glew-2.0.0-win32 \\ glew-2.0.0 \\ include;

我添加了鏈接程序常規庫目錄:C:\\ Users \\ timbucktoo \\ Desktop \\ Projects \\ Scape \\ Scape \\ OpenGL擴展二進制文件\\ unzipped \\ glew-2.0.0-win32 \\ glew-2.0.0 \\ lib \\ Release \\ x64;

Visual Studio告訴我我有一台x86機器,我不完全知道這意味着什么,但是從我認為這台機器正在運行64位Windows的角度出發。

我嘗試混合所有選項,例如不同的添加目錄/庫選項,但我無法解決。 可能之前曾有人問過這個問題,但Visual Studio Community 2017卻沒有問過。請幫助。 謝謝。 :)

哦,這是我還嘗試在glew32.lib中使用編譯指示的代碼。

#include <stdlib.h>
#include <stdio.h>
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <glm\glm.hpp>

int main()
{
    if (!glfwInit())
    {
        fprintf(stderr, "Failed to initialize GLFW\n");
        return -1;
    }
    glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want OpenGL 3.3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // To make MacOS             happy; should not be needed
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //We don't want the old OpenGL 

                                                               // Open a window and create its OpenGL context
GLFWwindow* window; // (In the accompanying source code, this variable is global)
window = glfwCreateWindow(1024, 768, "Tutorial 01", NULL, NULL);
if (window == NULL) {
    fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n");
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window); // Initialize GLEW
glewExperimental = true; // Needed in core profile
if (glewInit() != GLEW_OK) {
    fprintf(stderr, "Failed to initialize GLEW\n");
    return -1;
}

// Ensure we can capture the escape key being pressed below
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

do {
    // Draw nothing, see you in tutorial 2 !

    // Swap buffers
    glfwSwapBuffers(window);
    glfwPollEvents();

} // Check if the ESC key was pressed or the window was closed
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
    glfwWindowShouldClose(window) == 0);

}

在函數_main中引用的LNK2019無法解析的外部符號__imp__glewInit @ 0

這告訴您找不到外部符號。 這是因為您沒有鏈接glew32.lib

在使用MSVC / Visual Studio時,請嘗試將glew32.lib添加到項目目錄中。 然后在項目屬性->配置屬性->鏈接器->輸入->其他依賴 glew32.lib下添加glew32.lib 由於您使用的是MSVC,因此您也可以(如上所述)添加以下內容:

#pragma comment(lib, "glew32.lib")

如果您的項目目錄中有glew32.lib ,並將上面的行添加到.cpp文件中。 然后,該鏈接器錯誤不應出現。


現在(根據您的示例),只需添加類似glClear() ,然后您將獲得類似於以下內容的內容:

在函數_main中引用的LNK2019無法解析的外部符號__imp__glClear @ 4

那是因為您還需要將opengl32.lib添加到鏈接器。

#pragma comment(lib, "opengl32.lib")

如果收到這樣的鏈接器錯誤:

LNK4272:庫機器類型“ X86”與目標機器類型“ x64”沖突

這意味着您正在針對x64進行構建,但是某些庫是針對x86進行構建的。 換句話說,您可能正在使用glew32.lib的x64版本,而實際上需要使用glew32.lib的x86版本。


如果您的代碼可以編譯,但是在應用程序運行時,您將得到類似以下內容的信息:

該程序無法啟動,因為您的計算機缺少glew32.dll。

然后將glew32.dll添加到您的項目目錄。


同樣,版本也很重要,因此如果應用程序崩潰時會顯示類似以下內容:

應用程序無法正確啟動(0xc000007b)

然后就像在為x86構建應用程序之前一樣,但是glew32.dll是為x64構建的應用程序。


驗證上面的所有內容,它應該可以編譯並運行。

最后但並非最不重要的。 我強烈建議您改用GLAD,而不要使用GLEW。 GLEW古老而殘破,據我所知,它不再受支持了。

此外, GLAD更易於設置和使用。 您轉到生成器,選擇要定位的版本,按生成並下載一個實現( .c )文件和一些標頭( .h )。 而已。 沒有可鏈接的庫,沒有可攜帶的dll或任何東西。


我有一台x86機器,我不完全知道這意味着什么

x86是指令集體系結構。 但是x86更常用於指代32位。 而x64用於表示64位。 體系結構是相同的,只是64位而不是32位。 x86體系結構的64位版本也稱為x86-64或AMD64

這也意味着64位CPU可以執行32位指令。 但是32位CPU無法執行64位指令。 這就是為什么應用程序通常以32位計算機為目標的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM