c++ - CMake Clang无法编译OpenGL Hello World

标签 c++ macos opengl cmake clang

我正在尝试在Mac上测试OpenGL。我无法建立一个hello world项目。

项目结构:

➜ tree
.
├── CMakeLists.txt
└── main.cpp

0 directories, 2 files

main.cpp
#include <iostream>

// GLEW
#define GLEW_STATIC
#include <GL/glew.h>

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


const GLint WIDTH = 800, HEIGHT = 600;


int main(void){
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow *window = glfwCreateWindow(WIDTH, HEIGHT, "title", nullptr, nullptr);

    int screenWidth, screenHeight;

    // for mac
    glfwGetFramebufferSize(window, &screenWidth, &screenHeight);

    if ( nullptr == window)
    {
        std::cout << "failed to create glfw window" << std::endl;
        glfwTerminate();

        return -1;
    }

    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;

    if ( GLEW_OK != glewInit() )
    {
        std::cout << "Failed to initialize GLEW" << std::endl;

        return -1;
    }

    glViewport( 0, 0, screenWidth, screenHeight);

    while ( !glfwWindowShouldClose( window) )
    {
        // input from usr
        // processing loop

        glfwPollEvents();
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear( GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers( window);

    }
    glfwTerminate();

    return 0;
}

CMakeList.txt
cmake_minimum_required(VERSION 3.10)

set(CMAKE_CXX_STANDARD 14)


project(testas)

# Add source files
file(GLOB_RECURSE SOURCE_FILES
        ${CMAKE_SOURCE_DIR}/*.c
        ${CMAKE_SOURCE_DIR}/*.cpp)

# Add header files
file(GLOB_RECURSE HEADER_FILES
        ${CMAKE_SOURCE_DIR}/*.h
        ${CMAKE_SOURCE_DIR}/*.hpp)



add_executable(myopengl
    ${SOURCE_FILES}
    ${HEADER_FILES}
    )



####### DEPENDENCIES

# OpenGL

find_package(OpenGL REQUIRED)
include_directories(${OPENGL_INCLUDE_DIR})
target_link_libraries(myopengl ${OPENGL_LIBRARIES})
message(STATUS "OPENGL_INCLUDE_DIR at ${OPENGL_INCLUDE_DIR} FOUND")
message(STATUS "OPENGL_LIBRARIES at ${OPENGL_LIBRARIES} FOUND")

# PkfConfig

find_package(PkgConfig REQUIRED)
message(STATUS "PkgConfig FOUND")

# GLFW

pkg_search_module(GLFW REQUIRED glfw3)
include_directories(${GLFW_INCLUDE_DIRS})
target_link_libraries(myopengl ${GLFW_LIBRARIES})
message(STATUS "GLFW_INCLUDE_DIRS at ${GLFW_INCLUDE_DIRS} FOUND")
message(STATUS "GLFW_LIBRARIES at ${GLFW_LIBRARIES} FOUND")

# GLEW

pkg_search_module(GLEW REQUIRED glew)
include_directories(${GLEW_INCLUDE_DIRS})
target_link_libraries(myopengl ${GLEW_LIBRARIES})
message(STATUS "GLEW_INCLUDE_DIRS at ${GLEW_INCLUDE_DIRS} FOUND")
message(STATUS "GLEW_LIBRARIES at ${GLEW_LIBRARIES} FOUND")

# GLM

pkg_search_module(GLM REQUIRED glm)
include_directories(${GLM_INCLUDE_DIRS})
target_link_libraries(myopengl ${GLM_LIBRARIES})
message(STATUS "GLM_INCLUDE_DIRS at ${GLM_INCLUDE_DIRS} FOUND")

执行cmake。
➜ cmake .
-- OPENGL_INCLUDE_DIR at /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/OpenGL.framework FOUND
-- OPENGL_LIBRARIES at /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/OpenGL.framework;/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/System/Library/Frameworks/OpenGL.framework FOUND
-- PkgConfig FOUND
-- GLFW_INCLUDE_DIRS at /usr/local/Cellar/glfw/3.3.2/include FOUND
-- GLFW_LIBRARIES at glfw FOUND
-- GLEW_INCLUDE_DIRS at /usr/local/Cellar/glew/2.1.0_1/include FOUND
-- GLEW_LIBRARIES at GLEW FOUND
-- GLM_INCLUDE_DIRS at /usr/local/Cellar/glm/0.9.9.5/include FOUND
-- Configuring done
-- Generating done
-- Build files have been written to: /var/folders/48/0ffynlh529g4zx1_sh37gbtc0000gp/T/my-temp-XXXXXXXXXX.H1AsbU6N

并使错误:
➜ make
[ 25%] Linking CXX executable myopengl
ld: library not found for -lglfw
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [myopengl] Error 1
make[1]: *** [CMakeFiles/myopengl.dir/all] Error 2
make: *** [all] Error 2

pkg-config输出:
➜ pkg-config --list-all | grep -i opengl
glfw3                 GLFW - A multi-platform library for OpenGL, window and input
glew                  glew - The OpenGL Extension Wrangler library
sdl2                  sdl2 - Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.
glm                   GLM - OpenGL Mathematics

不幸的是,我不明白该输出。这令人困惑-找到了库,但是以某种方式链接程序无法附加内容。所有库都使用 brew 命令安装(如果重要),并且已通过 brew link 进行了安装。

规格:
macOS Catalina 10.15.4
cmake version 3.17.1
Apple clang version 11.0.3 (clang-1103.0.32.59)

最佳答案

找到软件包后,链接器不知道这些库在您的计算机上的位置。如果这些库不在标准系统库路径中,则需要显式提供这些库的完整路径。
pkg_search_module()应该为找到的每个XXX_LIBRARY_DIRS包提供一个XXX变量,该变量提供库文件的路径。因此,例如,对于GLFW软件包,您可以通过 target_link_directories() 告诉链接器在何处查找库:

pkg_search_module(GLFW REQUIRED glfw3)
include_directories(${GLFW_INCLUDE_DIRS})
# Add this line to tell the linker where to find the libraries.
target_link_directories(${GLFW_LIBRARY_DIRS})
target_link_libraries(myopengl ${GLFW_LIBRARIES})
message(STATUS "GLFW_INCLUDE_DIRS at ${GLFW_INCLUDE_DIRS} FOUND")
message(STATUS "GLFW_LIBRARIES at ${GLFW_LIBRARIES} FOUND")

关于c++ - CMake Clang无法编译OpenGL Hello World,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61309016/

相关文章:

c++ - 网格中的相邻产品

c++ - 通过继承专门化运算符模板

c++ while循环不会在错误条件下退出

xcode - 有没有办法为 Xcode 获取 iOS 11 的开发人员磁盘镜像?

xcode - macOS 应用程序不能分发 "developer ID"(选项不显示)

excel - 使用 VBA 通过 Word 控制 Excel 时遇到问题;后期绑定(bind)和早期绑定(bind)不起作用

c++ - OpenGL 调整纹理/四边形的大小

c++ - 未解析的外部符号 glewExperimental

c++ - 如何在 MFC 功能区应用程序中使用自动完成编辑控件

c++ - 优化 SphereInFrustrum 检查