esa / pagmo2

A C++ platform to perform parallel computations of optimisation tasks (global and local) via the asynchronous generalized island model.
https://esa.github.io/pagmo2/
GNU General Public License v3.0
808 stars 160 forks source link

[BUG] CMake having trouble with Boost #495

Closed luishpmendes closed 2 years ago

luishpmendes commented 2 years ago

I am having a hard time trying to install pagmo2 from source. The machine runs Ubuntu 18.04.5 LTS and have Boost version 1.65.1. Even though the Boost satisfies the minimum version requirement, I tried to install a newer version locally (I do not have super user access), but cmake doesn't find. When I try to install, I get the following error. Can anyone help me, please?

cmake --build .
[  1%] Building CXX object CMakeFiles/pagmo.dir/src/islands/fork_island.cpp.o
In file included from /usr/include/boost/serialization/void_cast.hpp:29:0,
                 from /usr/include/boost/archive/detail/iserializer.hpp:79,
                 from /usr/include/boost/archive/detail/interface_iarchive.hpp:22,
                 from /usr/include/boost/archive/detail/common_iarchive.hpp:23,
                 from /usr/include/boost/archive/basic_binary_iarchive.hpp:30,
                 from /usr/include/boost/archive/binary_iarchive_impl.hpp:21,
                 from /usr/include/boost/archive/binary_iarchive.hpp:20,
                 from /home/luishpmendes/pagmo2/include/pagmo/s11n.hpp:53,
                 from /home/luishpmendes/pagmo2/include/pagmo/problem.hpp:52,
                 from /home/luishpmendes/pagmo2/include/pagmo/bfe.hpp:48,
                 from /home/luishpmendes/pagmo2/include/pagmo/population.hpp:39,
                 from /home/luishpmendes/pagmo2/include/pagmo/algorithm.hpp:48,
                 from /home/luishpmendes/pagmo2/src/islands/fork_island.cpp:49:
/usr/include/boost/type_traits/is_virtual_base_of.hpp: In instantiation of ‘struct boost::detail::is_virtual_base_of_impl<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island>, boost::integral_constant<bool, true> >::boost_type_traits_internal_struct_X’:
/usr/include/boost/type_traits/is_virtual_base_of.hpp:80:5:   required from ‘const bool boost::detail::is_virtual_base_of_impl<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island>, boost::integral_constant<bool, true> >::value’
/usr/include/boost/type_traits/is_virtual_base_of.hpp:88:4:   required from ‘const bool boost::detail::is_virtual_base_of_impl2<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island> >::value’
/usr/include/boost/type_traits/is_virtual_base_of.hpp:97:45:   required from ‘struct boost::is_virtual_base_of<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island> >’
/usr/include/boost/mpl/if.hpp:63:11:   required from ‘struct boost::mpl::if_<boost::is_virtual_base_of<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island> >, boost::mpl::identity<boost::serialization::void_cast_detail::void_caster_virtual_base<pagmo::detail::isl_inner<pagmo::fork_island>, pagmo::detail::isl_inner_base> >, boost::mpl::identity<boost::serialization::void_cast_detail::void_caster_primitive<pagmo::detail::isl_inner<pagmo::fork_island>, pagmo::detail::isl_inner_base> > >’
/usr/include/boost/mpl/eval_if.hpp:37:41:   required from ‘struct boost::mpl::eval_if<boost::is_virtual_base_of<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island> >, boost::mpl::identity<boost::serialization::void_cast_detail::void_caster_virtual_base<pagmo::detail::isl_inner<pagmo::fork_island>, pagmo::detail::isl_inner_base> >, boost::mpl::identity<boost::serialization::void_cast_detail::void_caster_primitive<pagmo::detail::isl_inner<pagmo::fork_island>, pagmo::detail::isl_inner_base> > >’
/usr/include/boost/serialization/void_cast.hpp:279:17:   [ skipping 15 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/boost/serialization/export.hpp:86:1:   required from ‘struct boost::archive::detail::ptr_serialization_support<boost::archive::binary_iarchive, pagmo::detail::isl_inner<pagmo::fork_island> >’
/usr/include/boost/archive/detail/register_archive.hpp:25:8:   required from ‘struct boost::archive::detail::_ptr_serialization_support<boost::archive::binary_iarchive, pagmo::detail::isl_inner<pagmo::fork_island> >’
/usr/include/boost/archive/binary_iarchive.hpp:57:1:   required by substitution of ‘template<class Serializable> typename boost::archive::detail::_ptr_serialization_support<boost::archive::binary_iarchive, Serializable>::type boost::archive::detail::instantiate_ptr_serialization(Serializable*, boost::archive::binary_iarchive*, boost::archive::detail::adl_tag) [with Serializable = pagmo::detail::isl_inner<pagmo::fork_island>]’
/usr/include/boost/serialization/export.hpp:123:38:   required from ‘void boost::archive::detail::extra_detail::guid_initializer<T>::export_guid(mpl_::false_) const [with T = pagmo::detail::isl_inner<pagmo::fork_island>; mpl_::false_ = mpl_::bool_<false>]’
/usr/include/boost/serialization/export.hpp:133:20:   required from ‘const boost::archive::detail::extra_detail::guid_initializer<T>& boost::archive::detail::extra_detail::guid_initializer<T>::export_guid() const [with T = pagmo::detail::isl_inner<pagmo::fork_island>]’
/home/luishpmendes/pagmo2/src/islands/fork_island.cpp:380:1:   required from here
/usr/include/boost/type_traits/is_virtual_base_of.hpp:63:12: error: cannot derive from ‘final’ base ‘pagmo::detail::isl_inner<pagmo::fork_island>’ in derived type ‘boost::detail::is_virtual_base_of_impl<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island>, boost::integral_constant<bool, true> >::boost_type_traits_internal_struct_X’
     struct boost_type_traits_internal_struct_X : public Derived, virtual Base
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/type_traits/is_virtual_base_of.hpp: In instantiation of ‘struct boost::detail::is_virtual_base_of_impl<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island>, boost::integral_constant<bool, true> >::boost_type_traits_internal_struct_Y’:
/usr/include/boost/type_traits/is_virtual_base_of.hpp:80:5:   required from ‘const bool boost::detail::is_virtual_base_of_impl<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island>, boost::integral_constant<bool, true> >::value’
/usr/include/boost/type_traits/is_virtual_base_of.hpp:88:4:   required from ‘const bool boost::detail::is_virtual_base_of_impl2<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island> >::value’
/usr/include/boost/type_traits/is_virtual_base_of.hpp:97:45:   required from ‘struct boost::is_virtual_base_of<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island> >’
/usr/include/boost/mpl/if.hpp:63:11:   required from ‘struct boost::mpl::if_<boost::is_virtual_base_of<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island> >, boost::mpl::identity<boost::serialization::void_cast_detail::void_caster_virtual_base<pagmo::detail::isl_inner<pagmo::fork_island>, pagmo::detail::isl_inner_base> >, boost::mpl::identity<boost::serialization::void_cast_detail::void_caster_primitive<pagmo::detail::isl_inner<pagmo::fork_island>, pagmo::detail::isl_inner_base> > >’
/usr/include/boost/mpl/eval_if.hpp:37:41:   required from ‘struct boost::mpl::eval_if<boost::is_virtual_base_of<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island> >, boost::mpl::identity<boost::serialization::void_cast_detail::void_caster_virtual_base<pagmo::detail::isl_inner<pagmo::fork_island>, pagmo::detail::isl_inner_base> >, boost::mpl::identity<boost::serialization::void_cast_detail::void_caster_primitive<pagmo::detail::isl_inner<pagmo::fork_island>, pagmo::detail::isl_inner_base> > >’
/usr/include/boost/serialization/void_cast.hpp:279:17:   [ skipping 15 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
/usr/include/boost/serialization/export.hpp:86:1:   required from ‘struct boost::archive::detail::ptr_serialization_support<boost::archive::binary_iarchive, pagmo::detail::isl_inner<pagmo::fork_island> >’
/usr/include/boost/archive/detail/register_archive.hpp:25:8:   required from ‘struct boost::archive::detail::_ptr_serialization_support<boost::archive::binary_iarchive, pagmo::detail::isl_inner<pagmo::fork_island> >’
/usr/include/boost/archive/binary_iarchive.hpp:57:1:   required by substitution of ‘template<class Serializable> typename boost::archive::detail::_ptr_serialization_support<boost::archive::binary_iarchive, Serializable>::type boost::archive::detail::instantiate_ptr_serialization(Serializable*, boost::archive::binary_iarchive*, boost::archive::detail::adl_tag) [with Serializable = pagmo::detail::isl_inner<pagmo::fork_island>]’
/usr/include/boost/serialization/export.hpp:123:38:   required from ‘void boost::archive::detail::extra_detail::guid_initializer<T>::export_guid(mpl_::false_) const [with T = pagmo::detail::isl_inner<pagmo::fork_island>; mpl_::false_ = mpl_::bool_<false>]’
/usr/include/boost/serialization/export.hpp:133:20:   required from ‘const boost::archive::detail::extra_detail::guid_initializer<T>& boost::archive::detail::extra_detail::guid_initializer<T>::export_guid() const [with T = pagmo::detail::isl_inner<pagmo::fork_island>]’
/home/luishpmendes/pagmo2/src/islands/fork_island.cpp:380:1:   required from here
/usr/include/boost/type_traits/is_virtual_base_of.hpp:71:12: error: cannot derive from ‘final’ base ‘pagmo::detail::isl_inner<pagmo::fork_island>’ in derived type ‘boost::detail::is_virtual_base_of_impl<pagmo::detail::isl_inner_base, pagmo::detail::isl_inner<pagmo::fork_island>, boost::integral_constant<bool, true> >::boost_type_traits_internal_struct_Y’
     struct boost_type_traits_internal_struct_Y : public Derived
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CMakeFiles/pagmo.dir/build.make:75: recipe for target 'CMakeFiles/pagmo.dir/src/islands/fork_island.cpp.o' failed
make[2]: *** [CMakeFiles/pagmo.dir/src/islands/fork_island.cpp.o] Error 1
CMakeFiles/Makefile2:288: recipe for target 'CMakeFiles/pagmo.dir/all' failed
make[1]: *** [CMakeFiles/pagmo.dir/all] Error 2
Makefile:145: recipe for target 'all' failed
make: *** [all] Error 2
bluescarni commented 2 years ago

@luishpmendes it's probably a mistake on our part on declaring the minimum Boost version, as we normally test the code with the latest Boost version.

I would suggest you to set up a development environment via conda + conda-forge. You don't need root access for that.

See the instructions here:

https://docs.conda.io/en/latest/miniconda.html https://conda-forge.org/

Feel free to ask here if you need further directions.

luishpmendes commented 2 years ago

@bluescarni thanks for the reply.

I installed the miniconda and used it to install pagmo, using the following commands

conda config --add channels conda-forge
conda config --set channel_priority strict
conda install pagmo pagmo-devel

However, when I try to compile the getting_started.cpp file, I get the following error:

g++ -O2 -DNDEBUG -std=c++17 getting_started.cpp -pthread -lpagmo -lboost_serialization -ltbb
getting_started.cpp:3:10: fatal error: pagmo/algorithm.hpp: No such file or directory
 #include <pagmo/algorithm.hpp>
          ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.

On my own machine, where I have root access, I installed pagmo from the source-code. And I compile the code adding the path to the pagmo installation directory, as follows:

g++ -O2 -DNDEBUG -std=c++17 getting_started.cpp -pthread -lpagmo -lboost_serialization -ltbb -I /path/to/pagmo/.local/include -L /path/to/pagmo/lib -Wl,-R/path/to/pagmo/lib

Do I still need to do something like that? If so, how do I find the directory where conda installed pagmo?

luishpmendes commented 2 years ago

Update:

I found the directory where conda installed the packages. But I still can't compile.

g++ -O2 -DNDEBUG -std=c++17 getting_started.cpp -pthread -lpagmo -lboost_serialization -ltbb -I /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include -L /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/lib -lboost_serialization -I /home/luishpmendes/miniconda3/pkgs/pagmo-devel-2.18.0-hd2e5b28_0/include -L /home/luishpmendes/miniconda3/pkgs/pagmo-2.18.0-h2eca7fd_0/lib -Wl,-R/home/luishpmendes/miniconda3/pkgs/pagmo-2.18.0-h2eca7fd_0/lib -I /home/luishpmendes/miniconda3/pkgs/tbb-devel-2021.4.0-h4bd325d_1/include -L /home/luishpmendes/miniconda3/pkgs/tbb-2021.4.0-h4bd325d_1/lib -Wl,-R/home/luishpmendes/miniconda3/pkgs/tbb-2021.4.0-h4bd325d_1/lib -I /home/luishpmendes/miniconda3/pkgs/nlopt-2.7.0-py39h3e08f04_2/include -L /home/luishpmendes/miniconda3/pkgs/nlopt-2.7.0-py39h3e08f04_2/lib -Wl,-R/home/luishpmendes/miniconda3/pkgs/nlopt-2.7.0-py39h3e08f04_2/lib -I /home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/include -L /home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib -Wl,-R/home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib -lpagmo -ltbb -pthread
In file included from /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include/boost/graph/adjacency_iterator.hpp:13:0,
                 from /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include/boost/graph/detail/adjacency_list.hpp:37,
                 from /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include/boost/graph/adjacency_list.hpp:255,
                 from /home/luishpmendes/miniconda3/pkgs/pagmo-devel-2.18.0-hd2e5b28_0/include/pagmo/topology.hpp:43,
                 from /home/luishpmendes/miniconda3/pkgs/pagmo-devel-2.18.0-hd2e5b28_0/include/pagmo/archipelago.hpp:56,
                 from getting_started.cpp:5:
/home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include/boost/detail/iterator.hpp:13:37: note: #pragma message: This header is deprecated. Use <iterator> instead.
 BOOST_HEADER_DEPRECATED("<iterator>")
                                     ^
In file included from getting_started.cpp:5:0:
/home/luishpmendes/miniconda3/pkgs/pagmo-devel-2.18.0-hd2e5b28_0/include/pagmo/archipelago.hpp:143:35: warning: type attributes ignored after type is already defined [-Wattributes]
     friend class PAGMO_DLL_PUBLIC island;
                                   ^~~~~~
/usr/bin/ld: warning: libdmumps_seq-5.2.1.so, needed by //home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libmumps_common_seq-5.2.1.so, needed by //home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libpord_seq-5.2.1.so, needed by //home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libmpiseq_seq-5.2.1.so, needed by //home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libesmumps-6.so, needed by //home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libscotch-6.so, needed by //home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libscotcherr-6.so, needed by //home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libmetis.so, needed by //home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libgfortran.so.5, needed by //home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3, not found (try using -rpath or -rpath-link)
/home/luishpmendes/miniconda3/pkgs/pagmo-2.18.0-h2eca7fd_0/lib/libpagmo.so: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()@GLIBCXX_3.4.26'
//home/luishpmendes/miniconda3/pkgs/ipopt-3.14.4-h7ede334_0/lib/libipopt.so.3: undefined reference to `dmumps_c'
/home/luishpmendes/miniconda3/pkgs/pagmo-2.18.0-h2eca7fd_0/lib/libpagmo.so: undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()@GLIBCXX_3.4.26'
collect2: error: ld returned 1 exit status
luishpmendes commented 2 years ago

As conda apparently installed the correct boost version, I tried installing pagmo from source, and it worked. However, when I try to compile the getting_started.cpp file, it gives the following warning:

g++ -O0 -DNDEBUG -std=c++17 getting_started.cpp -o getting_started -pthread -lpagmo -lboost_serialization -ltbb -I /home/luishpmendes/pagmo/include -L /home/luishpmendes/pagmo/lib -Wl,-R/home/luishpmendes/pagmo/lib -I /home/luishpmendes/miniconda3/pkgs/tbb-devel-2021.4.0-h4bd325d_1/include -L /home/luishpmendes/miniconda3/pkgs/tbb-2021.4.0-h4bd325d_1/lib -Wl,-R/home/luishpmendes/miniconda3/pkgs/tbb-2021.4.0-h4bd325d_1/lib -I /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include -L /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/lib
In file included from /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include/boost/graph/adjacency_iterator.hpp:13:0,
                 from /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include/boost/graph/detail/adjacency_list.hpp:37,
                 from /home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include/boost/graph/adjacency_list.hpp:255,
                 from /home/luishpmendes/pagmo/include/pagmo/topology.hpp:43,
                 from /home/luishpmendes/pagmo/include/pagmo/archipelago.hpp:56,
                 from getting_started.cpp:5:
/home/luishpmendes/miniconda3/pkgs/boost-cpp-1.74.0-h359cf19_5/include/boost/detail/iterator.hpp:13:37: note: #pragma message: This header is deprecated. Use <iterator> instead.
 BOOST_HEADER_DEPRECATED("<iterator>")
                                     ^
In file included from getting_started.cpp:5:0:
/home/luishpmendes/pagmo/include/pagmo/archipelago.hpp:143:35: warning: type attributes ignored after type is already defined [-Wattributes]
     friend class PAGMO_DLL_PUBLIC island;
                                   ^~~~~~

And, it failt when I try to execute it:

./getting_started 
./getting_started: error while loading shared libraries: libtbb.so.12: cannot open shared object file: No such file or directory
luishpmendes commented 2 years ago

Finally manage to make it work. I needed to set some environment variables. Thanks for the help and sorry for flooding this thread.

bluescarni commented 2 years ago

@luishpmendes glad to hear you solved it.

In the future, I would recommend to: