#c #cmake #sdl-2
#c #cmake #sdl-2
Вопрос:
Я не понимаю, как статически включить исходный код SDL2. Я пытаюсь сделать это, чтобы сделать библиотеку, над которой я работаю, более переносимой.
Когда я настраивал это как исполняемый файл, библиотека была скомпилирована с ним нормально, но когда я изменил ее на библиотеку, она не включала библиотеку.
В настоящее время, когда я пытаюсь включить свою библиотеку в другой проект, он говорит: «Не удается открыть включаемый файл: ‘SDL2 / SDL.h’: нет такого файла или каталога». Поэтому это наводит меня на мысль, что причиной ошибки является то, что включаемые каталоги не экспортируются вместе со статической библиотекой.
Моя файловая система:
include
--Header Files
src
--Source Files
extern
--SDL2
build
Вот пример файла, вызывающего ошибку:
#include <iostream>
#include <SDL.h> //Error
using namespace std;
/* The code */
Вот пример моего основного 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)
Вот пример моего src CMakeLists.txt:
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" PUBLIC "${CMAKE_SOURCE_DIR}/extern/SDL2/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"
)
Комментарии:
1. Пожалуйста, покажите полный подробный вывод из команды сборки.
Ответ №1:
Из sdl2 CMakeLists.txt попробуй:
set(SDL_STATIC 1)
add_subdirectory(extern/SDL2) # And I recommend EXCLUDE_FROM_ALL
Также, чтобы убедиться, добавьте проверку:
foreach(i IN ITEMS SDL2main SDL2-static)
if(NOT TARGET ${i})
message(FATAL_ERROR "${i} is not a target")
endif()
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE SDL2main SDL2-static)
Комментарии:
1. Я попытался присвоить SDL_STATIC значение 1, но получил ту же ошибку «Ошибка состояния подавления строки файла проекта описания кода серьезности C1083 не удается открыть включаемый файл: ‘SDL.h’: нет такого файла или каталога» . Также проверка не сработала, она не будет компилироваться. Просто добавляю, но код компилировался, когда я создавал исполняемый файл, но когда я изменил его на библиотеку, произошел сбой.
2. @YamiOG
SDL.h
действительно существует по указанному вами пути включения:${CMAKE_SOURCE_DIR}/extern/SDL2/include
??3. Да, у него есть SDL.h. Код работает, когда я создаю исполняемый файл, но не когда я создаю библиотеку.