#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 и позволить SDL2CMakeLists.txt
выполнить остальную часть сборки.4. Значит, я не должен использовать SDL2main или SDL2-static в процессе сборки?
5. Если вы создаете SDL2 как часть своей библиотеки, то да, связывание с SDL2main и SDL2-static не требуется. Если вы создаете SDL2 с
add_subdirectory
помощью approach, то вам необходимо связать с полученными целями.