Как включить внешние библиотеки в проект CMake

#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. Код работает, когда я создаю исполняемый файл, но не когда я создаю библиотеку.