Question

EDIT: If you want to look at the code, here it is: https://github.com/WalterCapa/PercolationCpp/tree/master

I'm making a program that uses allegro5 library to generate an animation. Because i want to avoid the installation of the library on every computer that uses the program, i tried to paste the headers and the .so files in my project dir. So the tree is like this:

root

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)

The problem is this. I installed allegro5 in my pc with LinuxMint 13. Everything is fine if I compile from Code::Blocks or if I do it from the terminal using -I to call the hedaers and -L to tell where the .so files are, and even using cmake works fine, but when i try to do it in another computer, even if it's windows like my laptop or a virtual machine with linuxmint, it generates this error:

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

This is my 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})

Btw, when trying it on windows with MinGW i used cmake -G "MinGW Makefiles" .. and mingw32-make. It found the compiler and and cmake worked, but when i tried de second one it gave me the same error. In my desktop i'm compiling using g++.

Was it helpful?

Solution

I think that your actual problem is the leading / in this line:

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

A leading slash will tell cmake to look for an absolute path (like /usr/lib...) and not prefix it with a CMAKE_*_DIR. Try this

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

However I strong discourage you to include pre-built libraries in your project. If you can, integrate a tar-ball or a git-submodule. If the project you include is a cmake project itself, a simple call to add_subdirectory will make the targets (libraries usually) available to your project and create a dependency. If the project is based on configure you can use the ExternalProject-extension.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top