Clion (cmake) 不会 link 库
Clion (cmake) won't link the libraries
我在尝试 link SDL2 和 GL 库到 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 不会 link 有错误的库,例如对库函数的未定义引用。
然后一位朋友建议我将其写入 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
- Display.h
文件代码如下:
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;
}
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;
}
}
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 位)。提前致谢!
你必须修复你的 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) 设置包含目录。添加您的目标。 Link 个库到您的目标。
使用 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.
下载它
我在尝试 link SDL2 和 GL 库到 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 不会 link 有错误的库,例如对库函数的未定义引用。
然后一位朋友建议我将其写入 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
- Display.h
文件代码如下:
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; }
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; } }
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 位)。提前致谢!
你必须修复你的 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) 设置包含目录。添加您的目标。 Link 个库到您的目标。
使用 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.
下载它