фатальная ошибка: allegro5 \ allegro.h: на cmake еще не найден такой файл или каталог - PullRequest
0 голосов
/ 14 октября 2018

Так что я давно сделал игру на Visual Studio.2 года назад я загрузил исходники в github NEGU93 / ForbiddenDesert , чтобы он там был.Теперь я перешел с windows на linux и хотел вернуться и скомпилировать эту игру для linux.

Я помню, я использовал allegro для графического интерфейса, поэтому я установил его, выполнив следующие действия Установка Allegro 5 ,Когда я кодировал игру, я помню, как загружал allegro, подготовленный для Visual Studio напрямую, поэтому у меня не было никаких проблем.

Я создал CMakeLists.txt (никогда не делал этого раньше, поэтому я довольно нов в этой области):

# Specify the minimum version for CMake
cmake_minimum_required(VERSION 2.8)

# projects name
project(ForbiddenDesert)

set(CMAKE_CXX_STANDARD 11)  # enable C++11 standard
# Set the output folder where your program will be created
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
# Finds Allegro using pkgconfig, so it must be configured correctly
find_package(Allegro5 REQUIRED)
# Set include and lib dirs.
include_directories(${ALLEGRO_INCLUDE_DIR})
set(FD_LIBS ${LIBS} ${OBJC_LIBRARIES} ${ALLEGRO_LIBRARIES})


# The following folder will be included
# include_directories(${PROJECT_SOURCE_DIR}/src)
# include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories("${PROJECT_SOURCE_DIR}")

file(GLOB all_SRCS
        "*.h"
        "*.cpp"
        )

add_executable(forbidden ${all_SRCS})
target_link_libraries(forbidden ${FD_LIBS})

Я использую файл с именем FindAllegro5.cmake внутри папки с именем cmake/.Файл является копией eruta / FindAllegro5.cmake .

При запуске cmake . я получаю следующее:

-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1") 
-- Checking for module 'allegro-5'
--   Found allegro-5, version 5.2.4
-- Found Allegro5: /usr/lib/liballegro.so;/usr/lib/liballegro_image.so;/usr/lib/liballegro_font.so;/usr/lib/liballegro_primitives.so;/usr/lib/liballegro_ttf.so;/usr/lib/liballegro_audio.so;/usr/lib/liballegro_dialog.so;/usr/lib/liballegro_memfile.so;/usr/lib/liballegro_acodec.so;/usr/lib/liballegro_color.so;/usr/lib/liballegro_main.so;/usr/lib/liballegro_physfs.so 

Пока все хорошо.Тем не менее, когда я запускаю make

In file included from /home/ubuntu/Documents/GitHub/ForbiddenDesert/Button.h:5:0,
                 from /home/ubuntu/Documents/GitHub/ForbiddenDesert/ArcheologistButton.h:4,
                 from /home/ubuntu/Documents/GitHub/ForbiddenDesert/ArcheologistButton.cpp:1:
/home/ubuntu/Documents/GitHub/ForbiddenDesert/allegro.h:5:10: fatal error: allegro5\allegro.h: No such file or directory
 #include <allegro5\allegro.h>
          ^~~~~~~~~~~~~~~~~~~~
compilation terminated.
CMakeFiles/forbidden.dir/build.make:62: recipe for target 'CMakeFiles/forbidden.dir/ArcheologistButton.cpp.o' failed
make[2]: *** [CMakeFiles/forbidden.dir/ArcheologistButton.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/forbidden.dir/all' failed
make[1]: *** [CMakeFiles/forbidden.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

, я видел, что FindAllegro5.cmake имеет:

# Include dir
find_path(Allegro5_INCLUDE_DIR
  NAMES allegro5/allegro5.h
  PATHS ${Allegro5_PKGCONF_INCLUDE_DIRS}
)

Так что я изменил включение на #include <allegro5/allegro5.h>, но все еще не нашел решения.

Я не смог найти решение (я нашел много информации о "фатальной ошибке: allegro5 \ allegro.h: нет такого файла или каталога", но не нашел такого, которыйотносится к моему случаю).


Поэтому я установил allegro со следующим: Quickstart Allegro , а затем я создал файл hello.c и скомпилировал его, как там написано (gcc hello.c -o hello $(pkg-config allegro-5 allegro_font-5 --libs --cflags)) и это сработало.Поэтому проблема будет в том, как добавить эти флаги в cmakelists.txt

. Поэтому я попытался:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $(pkg-config allegro-5 allegro_font-5 allegro_primitives-5 allegro_ttf-5 allegro_image-5 allegro_audio-5 allegro_acodec-5  --libs --cflags)")

Но все равно не получилось.


Запуск find /usr/ -name "allegro*" Я нашел заголовок allegro5.h на /usr/include/allegro5/allegro5.h и некоторые другие файлы на /usr/lib/pkgconfig/.Итак, я сделал:

INCLUDE_DIRECTORIES( /usr/include/allegro5 )
LINK_DIRECTORIES(  /usr/lib/pkgconfig )
TARGET_LINK_LIBRARIES(game liballegro.a )

Все еще не работает.


Я попытался добавить библиотеки непосредственно из сборки, скомпилированной из исходного кода на github (следуя информации, найденной здесь Allegro и CMake ) и до сих пор не работает:

#Include Allegro
include_directories(/home/ubuntu/Documents/GitHub/allegro5/build/include)
include_directories(/home/ubuntu/Documents/GitHub/allegro5/build/lib/Headers)
link_directories(/home/ubuntu/Documents/GitHub/allegro5/build/lib)
#connect all the libraries you need
set(game_LIBS liballegro.so liballegro_dialog.so liballegro_image.so)
target_link_libraries(game ${game_LIBS})

1 Ответ

0 голосов
/ 15 октября 2018

Под Ubuntu я просто установил бы allegro с apt-get:

apt-get install liballegro5-dev

Тогда включения будут в нужном месте (/usr/include/allegro5/...)

Вы говорите, что установили allegro,но я не слишком уверен, будет ли это так же, как из пакета.Если это была сборка, часто каталогом установки по умолчанию является /usr/local вместо /usr.Таким образом, включения будут в /usr/local/include/allegro5/...

При этом ваша команда include() в cmake верна:

include_directories(${ALLEGRO_INCLUDE_DIR})

Однако обработка ваших библиотек совершенно неверна.Вам никогда не придется менять LD_FLAGS.(По крайней мере, за последние 6 или 7 лет я использовал cmake, у меня никогда не было необходимости.) Вместо этого вы хотите использовать target_link_libraries().Примерно так:

target_link_libraries(${PROJECT_NAME} ${ALLEGRO_LIBRARIES})

Он будет работать внутри (как после) a project(...).

Если вы хотите убедиться, что переменные имеют правильные имена, вы можете использовать message() команда.Некоторые библиотеки используют такие имена, как NAME_LIBRARY или NAME_INCLUDE_PATH.Они должны следовать надлежащему соглашению об именах, но ничто не заставляет их это делать, так что вы часто находите там какие-то шутки.

Следующее выведет сообщение:

message("allegro libraries = " ${ALLEGRO_LIBRARIES})

Если имя переменнойне правильно (или библиотека не найдена), вы ничего не увидите.Если вы поняли это правильно, он покажет вам библиотеки переменных.Я полагаю, что это правильно, но LD_FLAGS было, вероятно, то, что вы ошиблись.

...