2015-02-08 360 views
7

我在嘗試使用CLion創建SDL2項目。 問題是使用#include時找不到SDL標題。在CMake中使用SDL2

我的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}) 

我測試的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; 
} 

感謝您的幫助,您可以給我。

編輯: 我使用Windows和CLion配置爲使用cygwin64。

回答

10

不要用手路徑設置爲SDL2。使用正確的find命令,它使用FindSDL。應該是這樣的:

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})  

如果未找到SDL2,您必須將路徑添加到SDL2到CMAKE_PREFIX_PATH,這就是CMake的查找已安裝的軟件的地方。

如果你可以使用pkg配置,它的使用可能會更容易,看到How to use SDL2 and SDL_image with cmake

如果你感覺更舒服使用FindSDL2.cmake文件類似於FindSDL.cmake由CMake的提供,見https://brendanwhitfield.wordpress.com/2015/02/26/using-cmake-with-sdl2/

+1

我有一個'未知的CMake命令「find」'。但我可以用'find_library(SDL)'來代替。 – charlesrockbass 2015-09-03 17:35:09

+1

@charlesrockbass:謝謝你的提示,它應該是find_package。 – usr1234567 2015-09-04 08:41:46

+1

SDL與SDL2不同,默認的FindSDL.cmake不查找SDL2。 – Cubic 2016-08-27 16:14:48

1

您似乎沒有生成您的make文件的CMake錯誤。但我認爲你的問題是,SDL標題位於名爲「SDL2」的子文件夾中。

改變你的CMakeLists.txt包括

C:/SDL/SDL2-2.0.3/include/SDL2 

而不是

C:/SDL/SDL2-2.0.3/include 
0

在我回答的時候,SDL2提供了sdl2-config可執行文件(據我瞭解,開發者稱他爲「experimental」)。 在SDL2的「make install」之後,您可以嘗試從終端調用它,使用 sdl2-config --cflags --libs來查看它輸出的內容。

然後你就可以在你的makefile添加調用它:

set(PROJECT_NAME SomeProject) 

project(${PROJECT_NAME}) 

execute_process(COMMAND /usr/local/bin/sdl2-config --libs RESULT_VARIABLE CMD_RES OUTPUT_VARIABLE SDL2_CFLAGS_LIBS ERROR_VARIABLE ERR_VAR OUTPUT_STRIP_TRAILING_WHITESPACE) 
message("SDL2_CFLAGS_LIBS=${SDL2_CFLAGS_LIBS}; CMD_RES=${CMD_RES}; ERR_VAR=${ERR_VAR}") 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ${SDL2_CFLAGS_LIBS}") 

set(SOURCE_FILES main.cpp) 
add_executable(${PROJECT_NAME} ${SOURCE_FILES}) 

在這裏,我有一個問題 - 如果我只是把一個可執行文件名稱不包含路徑像

execute_process(COMMAND sdl2-config --libs <...> 

我得到錯誤「沒有這樣的文件「,即cmake不會在當前路徑中搜索,我不知道現在如何正確編寫它。

還有一個注意事項:在我的makefile中,我沒有用戶--cflags選項,因爲cmake發現包含正確,我不需要明確指定它們。

4

本博客文章顯示瞭如何做到這一點:Using SDL2 with 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}) 

在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) 

當你現在CMake-內部配置GUI應用程序將會有一個SDL2_DIR變量。您必須將其指向SDL2目錄,在該目錄中提取開發包並重新配置,然後所有內容都可以正常工作。

然後,您可以通過編寫#include "SDL.h"來包含SDL2標頭。