我正在尝试使用CLion来创建一个SDL2项目.问题是使用#include时无法找到SDL标头.
我的CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.8.4)
project(ChickenShooter)
set(SDL2_INCLUDE_DIR C:/SDL/SDL2-2.0.3/include)
set(SDL2_LIBRARY C:/SDL/SDL2-2.0.3/lib/x64)
include_directories(${SDL2_INCLUDE_DIR})
set(SOURCE_FILES main.cpp)
add_executable(ChickenShooter ${SOURCE_FILES})
target_link_libraries(ChickenShooter ${SDL2_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
我的测试main.cpp:
#include <iostream>
#include "SDL.h" /* This one can't be found */
int main(){
if (SDL_Init(SDL_INIT_VIDEO) != 0){
std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_Quit();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢你能给我的任何帮助.
编辑:我正在使用Windows,而CLion配置为使用cygwin64.
usr*_*567 18
不要手动设置SDL2的路径.使用使用FindSDL的正确find命令.应该是这样的:
find_file(SDL2_INCLUDE_DIR NAME SDL.h HINTS SDL2)
find_library(SDL2_LIBRARY NAME SDL2)
add_executable(ChickenShooter main.cpp)
target_include_directories(ChickenShooter ${SDL2_INCLUDE_DIR})
target_link_libraries(ChickenShooter ${SDL2_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
如果找不到SDL2,则必须将路径添加到SDL2 CMAKE_PREFIX_PATH,这是CMake查找已安装软件的位置.
如果你可以使用Pkg-config,它的使用可能会更容易,请参阅如何使用cmake使用SDL2和SDL_image
如果您觉得使用类似于CMake提供的FindSDL.cmake的FindSDL2.cmake文件感觉更舒服,请参阅https://brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2/
tre*_*nki 14
这篇博客文章展示了如何做到这一点:将SDL2与CMake一起使用
在Linux上,您可以使用最近的CMake(例如版本3.7)并使用SDL2开箱即用.
cmake_minimum_required(VERSION 3.7)
project(SDL2Test)
find_package(SDL2 REQUIRED)
include_directories(SDL2Test ${SDL2_INCLUDE_DIRS})
add_executable(SDL2Test Main.cpp)
target_link_libraries(SDL2Test ${SDL2_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
在Windows下,您可以下载SDL2开发包,将其解压缩到某处,然后sdl-config.cmake在提取的位置创建一个文件,其中包含以下内容:
set(SDL2_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/include")
# Support both 32 and 64 bit builds
if (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x64/SDL2main.lib")
else ()
set(SDL2_LIBRARIES "${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2.lib;${CMAKE_CURRENT_LIST_DIR}/lib/x86/SDL2main.lib")
endif ()
string(STRIP "${SDL2_LIBRARIES}" SDL2_LIBRARIES)
Run Code Online (Sandbox Code Playgroud)
现在,当您在CMake-GUI应用程序内部进行配置时,将会有一个SDL2_DIR变量.您必须将它指向SDL2目录,在该目录中解压缩dev包并重新配置,然后一切都应该工作.
然后,您可以通过编写来包含SDL2标头#include "SDL.h".
Tom*_*Tom 14
我最近发现最新版本的 SDL2(版本 2.0.12)现在附带了所有必需的 CMake 配置/安装脚本,因此无需再使用 FindSDL。
我从https://www.libsdl.org/download-2.0.php下载了 SDL 源代码,然后从根文件夹运行...
cmake -S . -B build/debug -G Ninja -DCMAKE_INSTALL_PREFIX=./install -DCMAKE_BUILD_TYPE=Debug
cmake --build build/debug --target install
Run Code Online (Sandbox Code Playgroud)
这将构建并安装库的调试版本,然后您还可以运行...
cmake -S . -B build/release -G Ninja -DCMAKE_INSTALL_PREFIX=./install -DCMAKE_BUILD_TYPE=Release
cmake --build build/release --target install
Run Code Online (Sandbox Code Playgroud)
这将构建并安装库的发布版本(并且由于 SDL CMake 脚本使用 DEBUG_POSTFIX,库的发布版本不会覆盖调试版本,因为调试版本的名称均附加有“d”)。
在您的 CMakeLists.txt 文件中,您可以简单地执行以下操作:
find_package(SDL2 REQUIRED)
add_executable(${PROJECT_NAME} ...)
target_link_libraries(
${PROJECT_NAME} PRIVATE
SDL2::SDL2
SDL2::SDL2main
Run Code Online (Sandbox Code Playgroud)
如果您像我在示例中所做的那样使用自定义位置,则需要告诉您的应用程序在哪里可以找到 SDL 安装文件夹。要从应用程序的根文件夹执行此操作,请运行:
find_package(SDL2 REQUIRED)
add_executable(${PROJECT_NAME} ...)
target_link_libraries(
${PROJECT_NAME} PRIVATE
SDL2::SDL2
SDL2::SDL2main
Run Code Online (Sandbox Code Playgroud)
注意:您可以使用
$(pwd)(*nix/macOS) 或%cd%(Windows) 创建非常有用的混合相对路径。
如果您想将 SDL 安装到默认系统位置,则可以忽略两者DCMAKE_INSTALL_PREFIX。DCMAKE_PREFIX_PATH
在示例中,我选择使用 Ninja 生成器,因为它在 macOS/Windows 上是一致的 - 它可以与 MSVC/Visual Studio 一起使用,只需确保运行它(路径可能会因年份/版本而略有不同)来添加忍者走上你的道路。
cmake -S . -B build/debug -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=</absolute/path/to/install/dir>
cmake --build build/debug
Run Code Online (Sandbox Code Playgroud)
更新:
我记得在 Windows 上有用的另一件事是能够将 SDL .dll 文件复制到应用程序二进制目录中,这可以通过以下方式实现:
if (WIN32)
# copy the .dll file to the same folder as the executable
add_custom_command(
TARGET ${PROJECT_NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:SDL2::SDL2>
$<TARGET_FILE_DIR:${PROJECT_NAME}>
VERBATIM)
endif()
Run Code Online (Sandbox Code Playgroud)
您还可以将 SDL 源存储库作为子模块引入,并通过add_subdirectory()和静态构建/链接它与您的主程序target_link_libraries():
cmake_minimum_required( VERSION 3.7.0 )
project( sdl2-demo )
set( SDL_STATIC ON CACHE BOOL "" FORCE )
set( SDL_SHARED OFF CACHE BOOL "" FORCE )
add_subdirectory( external/sdl )
add_executable(
sdl2-demo
"src/main.cpp"
)
target_link_libraries( sdl2-demo SDL2main SDL2-static )
Run Code Online (Sandbox Code Playgroud)
(至少从release-2.0.9tag 开始,可能更早。)
小智 5
cmake_minimum_required(VERSION 2.8.4)
project(ChickenShooter)
set(SDL2_INCLUDE_DIR C:/SDL/SDL2-2.0.3/include/SDL2)
set(SDL2_LIB_DIR C:/SDL/SDL2-2.0.3/lib/x64)
include_directories(${SDL2_INCLUDE_DIR})
link_directories(${SDL2_LIB_DIR})
set(SOURCE_FILES main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} SDL2main SDL2)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29703 次 |
| 最近记录: |