在 Windows 上编译 Linux OpenGL 应用程序?
Compile Linux OpenGL Application on Windows?
我制作了一个可以在 Linux 上正常编译的 OpenGL 应用程序。它使用静态 .a 库。现在我尝试使用 MinGW(和 .lib 库)和 g++ 进行编译,但结果 main.exe 在我尝试执行它时显示此错误:https://i.imgur.com/dpidmsw.png。
g++.exe -std=c++11 -Wall -o main.exe Main.cpp FastNoise.cpp shader.cpp texture.cpp glew32.lib glfw3.dll -lglu32 -lopengl32
当使用 cmake 和 CMakeGUI 创建一个 Visual Studio 项目时,它工作正常:
cmake_minimum_required(VERSION 3.5)
add_definitions(-DGLEW_STATIC)
set (CMAKE_CXX_STANDARD 11)
add_executable(main Main.cpp texture.cpp shader.cpp FastNoise.cpp)
find_package(OpenGL REQUIRED)
include_directories( ${OPENGL_INCLUDE_DIRS} )
IF (WIN32)
target_link_libraries(main ${CMAKE_CURRENT_SOURCE_DIR}/GLEW_1130.lib ${CMAKE_CURRENT_SOURCE_DIR}/glfw3.lib ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${X11_LIBRARIES})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/vertex.glsl ${CMAKE_CURRENT_BINARY_DIR}/Debug/vertex.glsl COPYONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fragment.glsl ${CMAKE_CURRENT_BINARY_DIR}/Debug/fragment.glsl COPYONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/dirt.bmp ${CMAKE_CURRENT_BINARY_DIR}/Debug/dirt.bmp COPYONLY)
ELSE()
include_directories( ${X11_INCLUDE_DIRS} )
find_package(X11 REQUIRED)
target_link_libraries(main ${CMAKE_CURRENT_SOURCE_DIR}/libGLEW.a ${CMAKE_CURRENT_SOURCE_DIR}/libglfw3.a ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${X11_LIBRARIES} X11 Xxf86vm pthread dl Xrandr Xinerama Xcursor)
ENDIF()
仅仅因为您拥有静态库并不意味着它们在任何方面都是系统独立的。您拥有的静态库都是为 Linux 目标构建的。他们希望使用不同于 Windows 的调用约定(即调用函数的方式)与 Linux 操作系统函数通信。本质上,您是在尝试将方形钉子推过此处的圆孔。那样不行。
要为 Windows 构建,您还需要为 Windows 移植和构建所有先决条件。幸运的是,您提到的所有库都有 Windows 端口,所以这不是问题。
I fixed it by adding these praeprocessor definitions:
…
您没有修复任何问题。你只是对一些东西(编译器、你的程序源代码等)撒了谎关于它构建的工具链和它构建的目标。
如果您开始重新定义系统级预处理器定义,那您就大错特错了。
这是你应该做的(好吧,我推荐的):前往 http://www.msys2.org/ 并获取 MSys2 安装程序。安装它,启动 MinGW… 环境(有 32 位和 64 位环境)。 MSys2 使用 Arch Linux 发行版的 Pacman 包管理器。使用它来安装工具链(make、binutils、gcc)——确保你安装了正确的变体,包数据库有 msys、mingw32 和 mingw64 的包——以及你需要的所有开发库。有适用于 GLEW、GLFW3 等的软件包。
接下来安装 CMake。我强烈建议 不要 使用 MSys2 包,但是来自 https://cmake.org/ 的独立安装程序——以这种方式安装的 CMake 知道如何与 MSys/MinGW 一起工作……等等。
然后为您的项目创建一个 CMakeLists.txt
,并使用它来创建构建环境。CMake 的好处在于,它是跨平台的,并且知道大量的构建系统和编译器环境。如果你的项目结构合理并且你不做疯狂的事情(或者你做疯狂的事情并在它周围穿上正确的紧身衣所以它不会横冲直撞)你会得到一些你可以毫不费力地构建的东西大多数目标环境。
我制作了一个可以在 Linux 上正常编译的 OpenGL 应用程序。它使用静态 .a 库。现在我尝试使用 MinGW(和 .lib 库)和 g++ 进行编译,但结果 main.exe 在我尝试执行它时显示此错误:https://i.imgur.com/dpidmsw.png。
g++.exe -std=c++11 -Wall -o main.exe Main.cpp FastNoise.cpp shader.cpp texture.cpp glew32.lib glfw3.dll -lglu32 -lopengl32
当使用 cmake 和 CMakeGUI 创建一个 Visual Studio 项目时,它工作正常:
cmake_minimum_required(VERSION 3.5)
add_definitions(-DGLEW_STATIC)
set (CMAKE_CXX_STANDARD 11)
add_executable(main Main.cpp texture.cpp shader.cpp FastNoise.cpp)
find_package(OpenGL REQUIRED)
include_directories( ${OPENGL_INCLUDE_DIRS} )
IF (WIN32)
target_link_libraries(main ${CMAKE_CURRENT_SOURCE_DIR}/GLEW_1130.lib ${CMAKE_CURRENT_SOURCE_DIR}/glfw3.lib ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${X11_LIBRARIES})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/vertex.glsl ${CMAKE_CURRENT_BINARY_DIR}/Debug/vertex.glsl COPYONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/fragment.glsl ${CMAKE_CURRENT_BINARY_DIR}/Debug/fragment.glsl COPYONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/dirt.bmp ${CMAKE_CURRENT_BINARY_DIR}/Debug/dirt.bmp COPYONLY)
ELSE()
include_directories( ${X11_INCLUDE_DIRS} )
find_package(X11 REQUIRED)
target_link_libraries(main ${CMAKE_CURRENT_SOURCE_DIR}/libGLEW.a ${CMAKE_CURRENT_SOURCE_DIR}/libglfw3.a ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${X11_LIBRARIES} X11 Xxf86vm pthread dl Xrandr Xinerama Xcursor)
ENDIF()
仅仅因为您拥有静态库并不意味着它们在任何方面都是系统独立的。您拥有的静态库都是为 Linux 目标构建的。他们希望使用不同于 Windows 的调用约定(即调用函数的方式)与 Linux 操作系统函数通信。本质上,您是在尝试将方形钉子推过此处的圆孔。那样不行。
要为 Windows 构建,您还需要为 Windows 移植和构建所有先决条件。幸运的是,您提到的所有库都有 Windows 端口,所以这不是问题。
I fixed it by adding these praeprocessor definitions:
…
您没有修复任何问题。你只是对一些东西(编译器、你的程序源代码等)撒了谎关于它构建的工具链和它构建的目标。
如果您开始重新定义系统级预处理器定义,那您就大错特错了。
这是你应该做的(好吧,我推荐的):前往 http://www.msys2.org/ 并获取 MSys2 安装程序。安装它,启动 MinGW… 环境(有 32 位和 64 位环境)。 MSys2 使用 Arch Linux 发行版的 Pacman 包管理器。使用它来安装工具链(make、binutils、gcc)——确保你安装了正确的变体,包数据库有 msys、mingw32 和 mingw64 的包——以及你需要的所有开发库。有适用于 GLEW、GLFW3 等的软件包。
接下来安装 CMake。我强烈建议 不要 使用 MSys2 包,但是来自 https://cmake.org/ 的独立安装程序——以这种方式安装的 CMake 知道如何与 MSys/MinGW 一起工作……等等。
然后为您的项目创建一个 CMakeLists.txt
,并使用它来创建构建环境。CMake 的好处在于,它是跨平台的,并且知道大量的构建系统和编译器环境。如果你的项目结构合理并且你不做疯狂的事情(或者你做疯狂的事情并在它周围穿上正确的紧身衣所以它不会横冲直撞)你会得到一些你可以毫不费力地构建的东西大多数目标环境。