OpenGL GLFW build errors OR linking errors

2019-08-07 14:23发布

问题:

Can someone help me get GLFW working in Visual Studio 2012? I can't get past initial compilation. I keep getting unresolved externals for the GLFW functions. The problem is, I don't know what I'm doing wrong. I could be:

  • Improperly making the source files with CMake.
  • Improperly building the library.
  • Improperly linking to the GLFW library.

I'm not sure which of these it is, so I'll just list what I did:

1. Downloaded glfw-3.1.1 from glfw.org.
2. Used CMake GUI to make the source files.
    a. Set source code to C:/GLFW/glfw-3.1.1
    b. Set "Where to build the binaries" to C:/GLFW/glfw-3.1.1/GLFW_Built (I created that directory)
    c. Clicked "Configure" 
    d. Selected "Visual Studio 11 2012" as the generator (I also tried "Visual Studio 11 2012 Win64," but it gave me the same results. The ARM one wouldn't build at all)
    e. Left "Use default native compilers" selected.
    f. Clicked "Finish."
    g. Set "BUILD_SHARED_LIBS" to true (checked).
    h. Clicked "Generate."
3. Built the library.
    a. Went to C:\GLFW\glfw-3.1.1\GLFW_Built and opened GLFW.sln in Visual Studio 2012.
    b. Clicked BUILD->Build ALL_BUILD (worked fine, no errors)
4. Created a new blank project in Visual Studio 2012.
5. Went into the properties pages and set:
    a. Configuration Properties/VC++ Directories/Include Directories: added "C:\GLFW\glfw-3.1.1\include"
    b. Configuration Properties/VC++ Directories/Library Directories: added "C:\GLFW\glfw-3.1.1\GLFW_Built\CMakeFiles\Export\lib" (it was the only lib folder I saw) and "C:\GLFW\glfw-3.1.1\GLFW_Built\src\Debug" (contains glfw3.dll and glfw3dll.lib)
    c. Configuration Properties/C/C++/Additional Include Directories: added "C:\GLFW\glfw-3.1.1\include"
    d. Configuration Properties/Linker/General: added "C:\GLFW\glfw-3.1.1\GLFW_Built\src\Debug
    e. Configuration Properties/Linker/Input: added "glfw3dll.lib" and "opengl32.lib"

For my code, I just have a very simple test program in main.cpp:

#include <GLFW/glfw3.h>
#include <thread>

int main()
{
    glfwInit();
    std::this_thread::sleep_for(std::chrono::seconds(1));
    glfwTerminate();
}

But I always get this in the output:

1>main.obj : error LNK2019: unresolved external symbol _glfwInit referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _glfwTerminate referenced in function _main
1>C:\Users\Adam\Desktop\Revenant\Revenant\Debug\Revenant.exe : fatal error LNK1120: 2 unresolved externals

回答1:

Extract GLFW to C:\glfw-src (such that CMakeLists.txt in the archive is at C:\glfw-src\CMakeLists.txt)

  • cd C:\glfw-src
  • mkdir build
  • cd build
  • cmake-gui ../
  • Press Configure, select toolchain
  • Set CMAKE_INSTALL_PREFIX to C:/glfw
  • Create c:\glfw directory
  • Press Configure again
  • Press Generate
  • Open build\GLFW.sln in Visual Studio
  • Build the Release version of the ALL_BUILD project
  • Build the Release version of the INSTALL project

C:\glfw should now contain include and lib directories.

Assuming a brand-new "Empty Project" solution:

  • Compiler: Add c:\glfw\include to /I (Configuration Properties -> C/C++ -> General -> Additional Include Directories)
  • Linker: Add c:\glfw\lib to /LIBPATH (Configuration Properties -> Linker -> General -> Additional Library Directories) and add glfw3.lib & opengl32.lib to /DYNAMICBASE (Configuration Properties -> Linker -> Input -> Additional Dependencies)