链接 SDL2 - CLion - Ubuntu 16.04 - G++
Linking SDL2 - CLion - Ubuntu 16.04 - G++
背景资料
正如标题所说,我在 Ubuntu 16.04 上使用 CLion 和 G++,但我无法 link SDL2。
SDL2.h 位于 External Libraries/Header Search Paths/include/SDL2
的项目中。这似乎 link 到 /usr/include/SDL2
.
因此,找到 header 文件后,我可以 #include <SDL2/SDL.h>
没有任何问题。然而,当我尝试将 SDL2 与 SDL_Init( SDL_INIT_EVERYTHING )
之类的东西一起使用时,我得到一个 undefined reference
.
如果我使用 g++ main.cpp -lSDL2 -o test
从终端编译我没有错误。但是,如果我使用 g++ main.cpp -o test
从终端编译,那么我会遇到与 CLion 相同的错误!
问题
如何 link SDL2 到 Cmake?我是否正确地将此标志 -lsdl2
添加到 CMake 文件中?如果我正确添加了它,那我还缺少什么?
main.cpp
#include <iostream>
#include <SDL2/SDL.h>
int main(int argc, char* argv[]) {
SDL_Init( SDL_INIT_EVERYTHING );
std::cout << "Hello, World!" << std::endl;
SDL_Quit();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
project(untitled2)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lSDL2")
add_executable(untitled2 main.cpp)
您只需要搜索 SDL2 包并将其 link 到目标即可。不要为此使用 CMAKE_CXX_FLAGS
(或任何类型的 linking/header paths/etc);尝试以下操作:
find_package(SDL2 REQUIRED SDL2)
:
add_executable(untitled2 main.cpp)
target_link_libraries(untitled2
PRIVATE SDL2::SDL2
)
这将为 headers 等引入适当的内容。请注意,这不会自动包含 SDL_main
或其他您可能需要或想要的库。
此外,对于旧版本的 SDL2,SDL2::SDL2
可能不起作用,您可能只需要 SDL2
。不过,如果是这种情况,我会建议升级。
你可以试试
SET(CMAKE_CXX_LINK_FLAGS "-lSDL2")
我修改了@rpav 给的答案。该项目具有测试 SDL2 实际上与 CLion 一起工作所需的最少代码。
main.cpp
#include <iostream>
#include <SDL2/SDL.h>
int main(int argc, char* argv[]) {
SDL_Init( SDL_INIT_EVERYTHING );
std::cout << "Hello, World!" << std::endl;
SDL_Quit();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
project(untitled2)
set(CMAKE_CXX_STANDARD 11)
find_package(SDL2 REQUIRED SDL2)
add_executable(untitled2 main.cpp)
target_link_libraries(untitled2 PRIVATE SDL2)
大部分 CMake 文件由 CLion 提供。仅有的额外代码行是 find_package(SDL2 REQUIRED SDL2)
和 target_link_libraries(untitled2 PRIVATE SDL2)
。澄清一下,untitled2
是我的项目名称。
背景资料
正如标题所说,我在 Ubuntu 16.04 上使用 CLion 和 G++,但我无法 link SDL2。
SDL2.h 位于 External Libraries/Header Search Paths/include/SDL2
的项目中。这似乎 link 到 /usr/include/SDL2
.
因此,找到 header 文件后,我可以 #include <SDL2/SDL.h>
没有任何问题。然而,当我尝试将 SDL2 与 SDL_Init( SDL_INIT_EVERYTHING )
之类的东西一起使用时,我得到一个 undefined reference
.
如果我使用 g++ main.cpp -lSDL2 -o test
从终端编译我没有错误。但是,如果我使用 g++ main.cpp -o test
从终端编译,那么我会遇到与 CLion 相同的错误!
问题
如何 link SDL2 到 Cmake?我是否正确地将此标志 -lsdl2
添加到 CMake 文件中?如果我正确添加了它,那我还缺少什么?
main.cpp
#include <iostream>
#include <SDL2/SDL.h>
int main(int argc, char* argv[]) {
SDL_Init( SDL_INIT_EVERYTHING );
std::cout << "Hello, World!" << std::endl;
SDL_Quit();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
project(untitled2)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lSDL2")
add_executable(untitled2 main.cpp)
您只需要搜索 SDL2 包并将其 link 到目标即可。不要为此使用 CMAKE_CXX_FLAGS
(或任何类型的 linking/header paths/etc);尝试以下操作:
find_package(SDL2 REQUIRED SDL2)
:
add_executable(untitled2 main.cpp)
target_link_libraries(untitled2
PRIVATE SDL2::SDL2
)
这将为 headers 等引入适当的内容。请注意,这不会自动包含 SDL_main
或其他您可能需要或想要的库。
此外,对于旧版本的 SDL2,SDL2::SDL2
可能不起作用,您可能只需要 SDL2
。不过,如果是这种情况,我会建议升级。
你可以试试
SET(CMAKE_CXX_LINK_FLAGS "-lSDL2")
我修改了@rpav 给的答案。该项目具有测试 SDL2 实际上与 CLion 一起工作所需的最少代码。
main.cpp
#include <iostream>
#include <SDL2/SDL.h>
int main(int argc, char* argv[]) {
SDL_Init( SDL_INIT_EVERYTHING );
std::cout << "Hello, World!" << std::endl;
SDL_Quit();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
project(untitled2)
set(CMAKE_CXX_STANDARD 11)
find_package(SDL2 REQUIRED SDL2)
add_executable(untitled2 main.cpp)
target_link_libraries(untitled2 PRIVATE SDL2)
大部分 CMake 文件由 CLion 提供。仅有的额外代码行是 find_package(SDL2 REQUIRED SDL2)
和 target_link_libraries(untitled2 PRIVATE SDL2)
。澄清一下,untitled2
是我的项目名称。