【问题标题】:I can't run a program that uses allegro5 with cmake我无法运行将 allegro5 与 cmake 一起使用的程序
【发布时间】:2014-01-30 23:20:45
【问题描述】:

编辑:如果你想查看代码,这里是: https://github.com/WalterCapa/PercolationCpp/tree/master

我正在制作一个使用 allegro5 库生成动画的程序。 因为我想避免在每台使用该程序的计算机上安装库,所以我尝试将标题和 .so 文件粘贴到我的项目目录中。所以树是这样的:

include
  allegro5  <- (Dir where the headers of allegro are)
  Percolation.h
  QuickUnion.h

lib
  allegro5  <-(Dir where the .so files are)
  Percolation.cpp
  QuickUnion.cpp

PercolationVisualizer <- (Dir that has the main)

问题是这样的。我用 LinuxMint 13 在我的电脑中安装 allegro5。如果我从 Code::Blocks 编译或者如果我从终端使用 -I 调用 hedaers 和 -L 来告诉哪里编译,一切都很好.so 文件是,即使使用 cmake 也可以正常工作,但是当我尝试在另一台计算机上执行此操作时,即使它是像我的笔记本电脑这样的 Windows 或带有 linuxmint 的虚拟机,它也会生成此错误:

make[2]: *** No rule to make target  '/./lib/allegro5/liballegro.so/', needed by'
../bin/PercolationVisualizer'.   Stop.
make[1]: *** [CMakeFiles/PercolationVisualizer.dir/all] Error 2
make: *** [all] Error 2

这是我的 CMakeLists.txt:

    cmake_minimum_required(VERSION 2.8.7)
    project(PercolationCpp)

    set(PercolationCpp_VERSION_MAJOR 0)
    set(PercolationCpp_VERSION_MINOR 1)

    set(EXECUTABLE_OUTPUT_PATH ../bin/)

    set(percolation_SRCS PercolationVisualizer/PercolationVisualizer.cpp lib/Percolation.cpp lib/QuickUnion.cpp)

    #Executable 
    add_executable(PercolationVisualizer  ${percolation_SRCS})

    #include Allegro
    include_directories(./include)
    link_directories(./lib/allegro5)
    #connect all the libraries
    set(allegro5_LIBS /./lib/allegro5/liballegro.so /./lib/allegro5/liballegro_primitives.so)

    target_link_libraries(PercolationVisualizer ${allegro5_LIBS})

顺便说一句,在使用 MinGW 的 Windows 上尝试时,我使用了 cmake -G "MinGW Makefiles" .. 和 mingw32-make。 它发现编译器和 cmake 可以工作,但是当我尝试第二个时,它给了我同样的错误。在我的桌面上,我正在使用 g++ 进行编译。

【问题讨论】:

    标签: c++ g++ cmake allegro5


    【解决方案1】:

    我认为您的实际问题是这一行中的领先/

    set(allegro5_LIBS /./lib/allegro5/liballegro.so /./lib/allegro5/liballegro_primitives.so)
    

    前导斜杠将告诉cmake 查找绝对路径(如/usr/lib...),而不是在其前面加上CMAKE_*_DIR。试试这个

    set(allegro5_LIBS ${CMAKE_SOURCE_DIR}/lib/allegro5/liballegro.so ${CMAKE_SOURCE_DIR}/lib/allegro5/liballegro_primitives.so)
    

    但是,我强烈建议您在项目中包含预构建的库。如果可以的话,集成一个 tar-ball 或一个 git-submodule。如果您包含的项目本身是一个 cmake 项目,则对 add_subdirectory 的简单调用将使您的项目可以使用目标(通常是库)并创建一个依赖项。如果项目是基于configure的,可以使用ExternalProject-extension。

    【讨论】:

    • 感谢您的回答。它适用于 linux mint 虚拟盒。我还没有尝试使用笔记本电脑。但我只尝试了第一个选项。包含预建库有什么问题?现在我正在阅读有关 add_subdirectory 的信息,再次感谢您的回答
    • 为特定平台生成编译对象和库。一个简单的例子是,为 64 位架构编译的库无法在 32 位架构上运行。 ARM 库无法在 i386-PC 上运行。 glibc-ABI 版本可能不同。列举一些原因。
    • 我从您的声誉中看到,您对 SO 很陌生。请不要忘记投票并接受答案,一旦你能够做到。欢迎来到 SO。
    • 哈哈,是的,我是新人,这是我的第一个问题,但我在网站上潜伏了一段时间,所以我知道其中的机制。但是我还没有选择答案,因为我不确定某些事情。但是你的绝对解决了这个问题,并给了我关于我应该知道和考虑的事情的有用信息。谢谢
    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2015-04-08
    • 2019-01-07
    相关资源
    最近更新 更多