C++ 如何在CMake项目中正确包含SDL2源代码

C++ 如何在CMake项目中正确包含SDL2源代码,c++,cmake,sdl-2,C++,Cmake,Sdl 2,我对如何静态地包含SDL2的源代码感到困惑。我正试图这样做,使我的图书馆工作更便携 目前,当我试图在另一个项目中包含我的库时,它会说“无法打开包含文件:'SDL2/SDL.h':没有这样的文件或目录” 我的文件系统: include --Header Files src --Source Files extern --SDL2 build 以下是导致错误的文件示例: #include <iostream> #include <SDL2/SDL.h> //Error u

我对如何静态地包含SDL2的源代码感到困惑。我正试图这样做,使我的图书馆工作更便携

目前,当我试图在另一个项目中包含我的库时,它会说“无法打开包含文件:'SDL2/SDL.h':没有这样的文件或目录”

我的文件系统:

include
--Header Files
src
--Source Files
extern
--SDL2
build
以下是导致错误的文件示例:

#include <iostream>
#include <SDL2/SDL.h> //Error

using namespace std;

/* The code */
下面是我的src CMakeLists.txt的一个示例:

cmake_minimum_required(VERSION 3.7)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

project(MyProject VERSION 1.0.0)

set(SDL2_SOURCE_DIR “${CMAKE_SOURCE_DIR}/extern/SDL2”)
add_subdirectory(extern/SDL2)
add_subdirectory(src)
set(PROJECT_NAME MyProject)

file(GLOB HEADER_FILES "${CMAKE_SOURCE_DIR}/include/*.h")
file(GLOB SOURCES "*.cpp")

add_library(${PROJECT_NAME} ${SOURCES} ${HEADER_FILES})

target_include_directories(${PROJECT_NAME} PUBLIC "${CMAKE_SOURCE_DIR}/include")

target_link_libraries(${PROJECT_NAME} PRIVATE SDL2main SDL2-static)

set_target_properties( ${PROJECT_NAME}
    PROPERTIES
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/lib"
    LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/lib"
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin"
)
add_subdirectory()将子目录作为cmake项目进行处理(为SDL处理提供的CMakeLists.txt)。如果您阅读CMakeLists.txt,您会看到它添加了相对于SDL2_SOURCE_DIR的include目录,默认情况下该目录为空

我将尝试将SDL2_SOURCE_DIR设置为${CMAKE_CURRENT_SOURCE_DIR}/extern/SDL2,以使路径成为绝对路径。像这样,SDL include dirs在项目中的任何地方都是有效的

您还可以使用include_directories()指令手动添加正确的include。

add_subdirectory()将子目录作为cmake项目进行处理(处理提供的用于SDL的CMakeLists.txt)。如果您阅读CMakeLists.txt,您会看到它添加了相对于SDL2_SOURCE_DIR的include目录,默认情况下该目录为空

我将尝试将SDL2_SOURCE_DIR设置为${CMAKE_CURRENT_SOURCE_DIR}/extern/SDL2,以使路径成为绝对路径。像这样,SDL include dirs在项目中的任何地方都是有效的


您还可以使用include_directories()指令手动添加正确的include。

我是否应该在目标目录上使用include_directories()。我还应该将SDL2文件编译到我的add_库函数中吗?如果您想要精确控制哪些目录包含哪些目标,请使用target_include_目录。通常,最好使用include_目录,因为它会自动影响所有目标。SDL CMakeLists.txt已经有一个add_库,我认为它应该导出一个变量来指示编译库的位置,这样您就可以在target_link_库中使用它。感谢您的帮助,但是SDL.h找不到的错误仍然存在。对于为什么我应该使用include_directories()而不是target_include_directories(),您还有其他想法吗。我还应该将SDL2文件编译到我的add_库函数中吗?如果您想要精确控制哪些目录包含哪些目标,请使用target_include_目录。通常,最好使用include_目录,因为它会自动影响所有目标。SDL CMakeLists.txt已经有一个add_库,我认为它应该导出一个变量来指示编译库的位置,这样您就可以在target_link_库中使用它。感谢您的帮助,但是SDL.h找不到的错误仍然存在。你对为什么还有其他想法吗