【问题标题】:Clion (cmake) won't link the libraries [closed]Clion(cmake)不会链接库[关闭]
【发布时间】:2018-08-18 04:30:09
【问题描述】:

我在尝试将 SDL2GL 库链接到 Clion (cmake) 时遇到问题。尽管更改了 cmakelists.txt 并添加了 target-link-libraries() 函数。所以cmake文件看起来像这样:

cmake_minimum_required(VERSION 3.9)
project(OpenGL1)

set(CMAKE_CXX_STANDARD 17)

target_link_libraries(OpenGL1 SDL2 GL)

add_executable(OpenGL1 main.cpp Display1.cpp Display1.h)

但没有运气。 Clion 不会将库链接到错误,例如对库函数的未定义引用。

然后朋友建议我将其写入 cmakelists 文件:

cmake_minimum_required(VERSION 3.9)
project(OpenGL1)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lGL -lSDL2 -lOpenGL")


add_executable(OpenGL1 main.cpp Display1.cpp Display1.h)

它有点工作......但它找不到 -lOpenGL。 最后但并非最不重要的一点是,我的项目不会使用 g++ 在终端中以传统方式编译。它可以用一个 .cpp 文件编译得很好。 我的项目由 2 个 cpp 文件和一个头文件组成。像这样:

  • main.cpp
  • Display1.cpp
  • 显示.h

文件代码如下:

  1. main.cpp

    #include <iostream>
    #include "Display.h"
    
    using namespace std;
    
    int main() {
        Display d1(800,600,"Hello");
    
        while (!d1.m_isClosed()){
            d1.Clear(0.0f, 0.15f, 0.3f, 1.0f);
            d1.Update();
        }
        return 0;
    }
    
  2. Display1.cpp

    #include "Display.h"
    #include <GL/glew.h>
    
    using namespace std;
    
    Display::Display(int width, int height, const string title) {
        SDL_Init(SDL_INIT_EVERYTHING);
        SDL_GL_SetAttribute(SDL_GL_RED_SIZE,8);
        SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,8);
        SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,8);
        SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE,8);
        SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE,32);
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
    
        m_window = SDL_CreateWindow(title.c_str(),SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,width,height,SDL_WINDOW_OPENGL);
        m_glContext = SDL_GL_CreateContext(m_window);
    
        GLenum status = glewInit();
        if (status != GLEW_OK)
            cerr << "Glew failed!" << endl;
    
        isClosed = false;
    }
    
    Display::~Display() {
        SDL_GL_DeleteContext(m_glContext);
        SDL_DestroyWindow(m_window);
        SDL_Quit();
    }
    
    void Display::Clear(float r, float g, float b, float a) {
        glClearColor(r,g,b,a);
        glClear(GL_COLOR_BUFFER_BIT);
    }
    
    bool Display::m_isClosed() {
        return isClosed;
    }
    
    void Display::Update() {
        SDL_GL_SwapWindow(m_window);
    
        SDL_Event e;
        while (SDL_PollEvent(&e)){
            if (e.type == SDL_QUIT)
                isClosed = true;
        }
    }
    
  3. Display1.h

     #ifndef OPENGL_DISPLAY_H
     #define OPENGL_DISPLAY_H
    
     #include <iostream>
     #include <SDL2/SDL.h>
    
     using namespace std;
    
    
     class Display {
      SDL_Window* m_window;
      SDL_GLContext m_glContext;
      bool isClosed;
     public:
       Display(int width, int height, string title);
       virtual ~Display();
       void Update();
       bool m_isClosed();
       void Clear(float r, float g, float b, float a);
    };
    
    
    #endif //OPENGL_DISPLAY_H
    

现在,我知道其他人也问过同样的问题,但没有什么能帮助我,所以这就是我问的原因。我正在运行 Ubuntu 17.10(64 位)。提前致谢!

【问题讨论】:

  • 您可以尝试使用以下 FindSDL2 cmake 脚本为您查找依赖项。将它们链接到您的程序的示例可以在自述文件中找到:github.com/tcbrindle/sdl2-cmake-scripts。您可以使用内置的 findOpenGL 为 OpenGL 做同样的事情:cmake.org/cmake/help/v3.0/module/FindOpenGL.html
  • 你得到一些 cmake 错误吗?例如。 target_link_libraries 应该在 add_executable 之后。你的订单是错误的。
  • 您需要找到这些库。因此您可以使用find_package,例如find_package(OpenGL)。然后你需要添加包含目录并将库链接到include_directories(${OPENGL_INCLUDE_DIRS}) resp。 target_link_libraries(OpenGL1 ${OPENGL_LIBRARIES}).
  • Using SDL2 with CMake的可能重复
  • @ThomasSablik 没错。写错了,但我的顺序是正确的,尽管这里写错了。

标签: c++ opengl cmake sdl-2 clion


【解决方案1】:

您必须修复您的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.9)
project(OpenGL1)

set(CMAKE_CXX_STANDARD 17)

find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)

set(SDL2_INCLUDE_DIRS /usr/include/SDL2)
set(SDL2_LIBRARIES /usr/lib/x86_64-linux-gnu/libSDL2.so)

include_directories(${OPENGL_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS})

add_executable(OpenGL1 main.cpp Display1.cpp Display1.h)

target_link_libraries(OpenGL1 ${OPENGL_LIBRARIES} ${GLEW_LIBRARIES} ${SDL2_LIBRARIES})

首先找到带有find_package(OpenGL REQUIRED) 的OpenGL 文件。然后设置 SDL2 的路径。为您的目标 (OpenGL1) 设置包含目录。添加你的目标。将库链接到您的目标。

使用 SDL2 的更好方法是使用 FindSDL2.cmake 并将 find_package(SDL2) 添加到您的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.9)
project(OpenGL1)

set(CMAKE_CXX_STANDARD 17)

find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(SDL2 REQUIRED)

include_directories(${OPENGL_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS} ${SDL2_INCLUDE_DIRS})

add_executable(OpenGL1 main.cpp Display1.cpp Display1.h)

target_link_libraries(OpenGL1 ${OPENGL_LIBRARIES} ${GLEW_LIBRARIES} ${SDL2_LIBRARIES})

SDL2 安装了自己的名为 sdl2-config.cmake 的 cmake 配置文件,因此您无需从 github 下载。

【讨论】:

  • 谢谢!但是得到了这个错误:c++: error: $(SDL2_LIBRARY): Δεν υπάρχει τέτοιο αρχείο ή κατάλογος(希腊语中没有这样的文件或目录。)
  • 您必须自己安装 SDL2 并设置路径。您可以使用find /usr -name libSDL2.so 进行搜索。在我的 Ubuntu 上是/usr/lib/x86_64-linux-gnu/libSDL2.so。当您使用 FindSDL2.cmake 时,脚本会为您配置通行证。
  • 我做了一些步骤。我没有玩“FindSDL2.cmake”,但设置了 sdl2、opengl 目录的路径,我使用了 find_library 函数并提供了两个库的确切路径,然后链接它们,但仍然出现错误“/usr/bin /ld: 找不到 -lOPENGL"。我无权访问。
  • 你确定你的系统上安装了OpenGL吗?
  • 是的,我检查过了,一切都安装好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2018-10-25
相关资源
最近更新 更多