Как включить SDL2 в исходные файлы (.cpp)

#c #cmake #sdl #sdl-2

#c #cmake #sdl #sdl-2

Вопрос:

Я пытался выяснить, как переносимо включить SDL2 в мою библиотеку. Я пришел к решению, что если бы я включил SDL2 в исходные файлы, мне не пришлось бы беспокоиться о пути включения. Единственное, что мне нужно было бы сделать, это переслать объявленные типы SDL2. Я успешно скомпилировал код, но когда я попытался включить свою библиотеку, появились ошибки, связанные с неопределенностью функций, вот пример, неопределенная ссылка на ‘SDL_Init’, Может кто-нибудь, пожалуйста, объяснит мне, что я делаю неправильно.

Вот пример:

App.h

 #include <iostream>

struct SDL_Window;

class App{
   public:
     SDL_Window w;
     App(){}
     App(int width, int height)
};
  

App.cpp

 #include "App.h"

#include <SDL.h>

App::App(int width, int height){
    SDL_Init(SDL_INIT_EVERYTHING);
    w = SDL_CreateWindow("Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_OPENGL);
}
  

CMakeLists.txt Главный

 cmake_minimum_required(VERSION 3.7)

set(PROJECT_NAME MyProject)

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")

Project(${PROJECT_NAME} VERSION 1.0.0)

add_subdirectory(extern/SDL2)

add_subdirectory(src)
  

CMakeLists.txt Src

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

file(GLOB SDL2_HEADER_FILES "${CMAKE_SOURCE_DIR}/extern/SDL2/include/*.h")
file(GLOB_RECURSE SDL2_SOURCES "${CMAKE_SOURCE_DIR}/extern/SDL2/src/*.c" "${CMAKE_SOURCE_DIR}/extern/SDL2/src/*.cpp")

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

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

target_link_libraries(${PROJECT_NAME} PUBLIC SDL2main PUBLIC 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"
)
  

CMakeLists.txt Тест

 cmake_minimum_required(VERSION 3.7)

Project(Test)

include_directories(Test PUBLIC "${CMAKE_SOURCE_DIR}/../MyProject/include")

add_executable(Test main.cpp)

target_link_libraries(Test "${CMAKE_SOURCE_DIR}/../MyProject/lib/libMyProject.a")
  

Комментарии:

1. Итак, вы хотите создать SDL2 самостоятельно (в соответствии с этой строкой file(GLOB_RECURSE SDL2_SOURCES ...) или вы хотите связать с существующей библиотекой ( target_link_libraries(${PROJECT_NAME} PUBLIC SDL2main PUBLIC SDL2-static) )? Если первое, то вам не следует связываться с SDL2. Если последнее, то вам также необходимо связать ваше приложение с SDL2 (библиотека libMyProject.a не поддерживает эту связь, потому что это статическая библиотека).

2. Думаю, я хочу собрать SDL2 самостоятельно, поэтому мне не нужно беспокоиться о другом файле библиотеки

3. Обратите внимание, что создание SDL2 самостоятельно маловероятно, «просто перечислите исходные файлы и передайте их компилятору». SDL2 поддерживает сборку через CMake, поэтому вы можете просто включить его исходный каталог через add_subdirectory call и позволить SDL2 CMakeLists.txt выполнить остальную часть сборки.

4. Значит, я не должен использовать SDL2main или SDL2-static в процессе сборки?

5. Если вы создаете SDL2 как часть своей библиотеки, то да, связывание с SDL2main и SDL2-static не требуется. Если вы создаете SDL2 с add_subdirectory помощью approach, то вам необходимо связать с полученными целями.