Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 致命错误:allegro5\allegro.h:在cmake上尚未找到此类文件或目录_C++_Cmake_Allegro5 - Fatal编程技术网

C++ 致命错误:allegro5\allegro.h:在cmake上尚未找到此类文件或目录

C++ 致命错误:allegro5\allegro.h:在cmake上尚未找到此类文件或目录,c++,cmake,allegro5,C++,Cmake,Allegro5,所以很久以前我在Visual Studio上做了一个游戏。2年前,我将源代码上传到github,只是为了让它在那里。现在我从windows改为linux,我想回去为linux编译这个游戏 我记得我使用allegro作为GUI,所以我按照以下步骤安装了它。当我编写游戏时,我记得我直接下载了一个为VisualStudio准备的allegro,所以我没有遇到任何问题 我创建了一个CMakeLists.txt(以前从未这样做过,所以我在该领域还是新手): 我正在名为cmake/的文件夹中使用名为Find

所以很久以前我在Visual Studio上做了一个游戏。2年前,我将源代码上传到github,只是为了让它在那里。现在我从windows改为linux,我想回去为linux编译这个游戏

我记得我使用allegro作为GUI,所以我按照以下步骤安装了它。当我编写游戏时,我记得我直接下载了一个为VisualStudio准备的allegro,所以我没有遇到任何问题

我创建了一个CMakeLists.txt(以前从未这样做过,所以我在该领域还是新手):

我正在名为
cmake/
的文件夹中使用名为
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
因此,我将include更改为
#include,然后创建了
hello.c
文件,并按照上面的说明编译了它(
gcc hello.c-o hello$(pkg config allegro-5 allegro\u 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*”
我在
/usr/include/allegro5/allegro5.h
上找到了标题
allegro5.h
,在
/usr/lib/pkgconfig/
上找到了一些其他文件。 所以我做了:

INCLUDE_DIRECTORIES( /usr/include/allegro5 )
LINK_DIRECTORIES(  /usr/lib/pkgconfig )
TARGET_LINK_LIBRARIES(game liballegro.a )
仍然不起作用


我尝试直接从github上的源代码编译的构建中添加库(遵循我在此处找到的信息),但仍然没有成功:

#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})

在Ubuntu下,我只需安装allegro,并带有
apt get

apt-get install liballegro5-dev
然后include将位于正确的位置(
/usr/include/allegro5/…

你说你安装了allegro,但我不太确定它是否与软件包中的一样。如果它来自一个构建,那么默认安装目录通常是
/usr/local
,而不是
/usr
。因此,include将位于
/usr/local/include/allegro5/…

也就是说,cmake中的
include()
命令是正确的:

include_directories(${ALLEGRO_INCLUDE_DIR})
但是,您的库处理是完全错误的。您永远不必更改
LD\u标志
。(至少,在过去的6、7年中,我一直在使用cmake,但我从未有过这样的需求。)相反,您希望使用。大概是这样的:

target_link_libraries(${PROJECT_NAME} ${ALLEGRO_LIBRARIES})
它将在
项目(…)
内工作(如在after中)

如果要验证变量的名称是否正确,可以使用命令。有些库使用诸如
NAME\u LIBRARY
NAME\u INCLUDE\u PATH
之类的名称。他们应该遵循正确的命名约定,但没有什么强迫他们这样做,所以你经常会在那里发现一些有趣的东西

以下内容将打印一条消息:

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

如果变量名不正确(或找不到库),您将什么也看不到。如果正确,它将显示变量库。我想这是对的,但是
LD\u标志
可能是您弄错的。

从未设置
CMAKE\u BINARY\u DIR
变量。即使CMake不强制执行,变量也应被视为只读。感谢@Tsyvarev的建议。我是根据。但是我可以删除它。太糟糕了,以至于教程显示了错误的用法。顺便说一下,设置
CMAKE\u BINARY\u DIR
变量实际上可能会添加一些奇怪的错误,我建议您在没有该设置的情况下重新检查代码。(在新尝试之前,不要忘记从构建目录中删除
cmakcache.txt
文件)。在这种情况下,这没有帮助,您在
INCLUDE\u目录调用中使用的
ALLEGRO\u INCLUDE\u DIR
变量的内容是什么?为了检查您是否可以在
find\u package()
调用之后添加行
“message(ALLEGRO\u INCLUDE\u DIR:${ALLEGRO\u INCLUDE\u DIR}”)
。因此,我对
CMAKE\u BINARY\u DIR
进行了注释,正如您所说,添加了该行,并得到以下内容:
ALLEGRO\u INCLUDE\u DIR:/usr/INCLUDE
。我确实有
allegro5/
文件夹在该路径中,其中包含
allegro5.h
。我将代码改为do
,而不是
,但我也有同样的错误。嗯,这看起来很奇怪。那么,在C代码中使用的确切路径分隔符是什么?错误消息包含反斜杠(
#include
),但您告诉我们您将
更改为。据我所知,gcc(Linux上的默认编译器)只使用正斜杠
/
,不理解include文件的反斜杠。谢谢您提供的信息。我照你说的做了。我仍然有问题,但最后我把
`改成了一个
/`并且它工作了。但是,我当前的工作版本与您对CMakeLists.txt文件的建议一致。我还通过de
apt get
进行了安装。因此,我不确定我的旧版本的CMake是否会起作用。好吧,我很高兴你至少取得了进展。是的,路径中的反斜杠(\)在gcc/g++中不起作用。
target_link_libraries(${PROJECT_NAME} ${ALLEGRO_LIBRARIES})
message("allegro libraries = " ${ALLEGRO_LIBRARIES})