Compilation programme c++ avec g++ et bibliothèque boost ou spdlog

Bonjour à tous,
Je programme actuellement une petite application c++ qui fait de la communication avec des machines Focas.

Pour faire les choses proprement j’aimerais faire des logs pour pouvoir débugué. j’ai essayer plusieurs librairie tels que spdlog ou boost-log mais lorsque je compile le linker échoue a faire le lien entre mon programme et la bibliothèque il me retourne l’erreur suivante :

/usr/bin/ld : /tmp/cckH4kku.o : dans la fonction « main » :
main.cpp:(.text+0x11) : référence indéfinie vers « boost::log::v2s_mt_posix::trivial::logger::get() »
...
...

Pour obtenir ca j’ai installé pour boost https://www.boost.org/ :

sudo apt install libboost-all-dev

écrit le programme :

#include "main.hpp"
#include <boost/log/trivial.hpp>

using namespace std;

int main(int argc, char **argv){
  BOOST_LOG_TRIVIAL(info) << "Hello, world!";
  cout << "No error, program exit" << endl;
  return 0; 
}

Et enfin écrit la ligne g++

 g++ src/main.cpp -o bin/program -lboost_log -lpthread

Bien sur sans l’ajout de la lib ça compile correctement et je peut lancer le programme

Test suppmémentaire

A noter que j’ai fait exactement la même chose avec spdlog vous trouverez la documentation ici : https://github.com/gabime/spdlog. J’applique rigoureusement le tuto.

J’ai essayé sur Debian Bullseye et Skretch en debootstrap et Ubuntu en VM et même erreur. j’ai essayer de débug avec chatgpt mais il m’aide a rien.

Enfin pour finir j’ai essayé de compiler avec une librairie random gtest et la compilation s’exécute. Je ne comprend pas pourquoi ça ne marche pas.

J’ai essayé une autre bibliothèque de log glog https://github.com/google/glog

Ça fonctionne mais c’est du google. C’est quand même étrange que les autres bibliothèque sois si compliqué a compilé.

sudo apt install libgoogle-glog-dev
g++  src/main.cpp -o app -lglog

Pour ce que ça intéresse voici la totalité des logs :

g++ -v src/main.cpp -o bin/program -lboost_log -lpthread
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:amdgcn-amdhsa:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 10.2.1-6' --with-bugurl=file:///usr/share/doc/gcc-10/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,m2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-10 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --enable-libphobos-checking=release --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-10-Km9U7s/gcc-10-10.2.1/debian/tmp-nvptx/usr,amdgcn-amdhsa=/build/gcc-10-Km9U7s/gcc-10-10.2.1/debian/tmp-gcn/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-build-config=bootstrap-lto-lean --enable-link-mutex
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 10.2.1 20210110 (Debian 10.2.1-6) 
COLLECT_GCC_OPTIONS='-v' '-o' 'bin/program' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/10/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE src/main.cpp -quiet -dumpbase main.cpp -mtune=generic -march=x86-64 -auxbase main -version -fasynchronous-unwind-tables -o /tmp/ccRp0anL.s
GNU C++14 (Debian 10.2.1-6) version 10.2.1 20210110 (x86_64-linux-gnu)
	compiled by GNU C version 10.2.1 20210110, GMP version 6.2.1, MPFR version 4.1.0, MPC version 1.2.0, isl version isl-0.23-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/10"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/10/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/10/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/10
 /usr/include/x86_64-linux-gnu/c++/10
 /usr/include/c++/10/backward
 /usr/lib/gcc/x86_64-linux-gnu/10/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C++14 (Debian 10.2.1-6) version 10.2.1 20210110 (x86_64-linux-gnu)
	compiled by GNU C version 10.2.1 20210110, GMP version 6.2.1, MPFR version 4.1.0, MPC version 1.2.0, isl version isl-0.23-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 048fcaee3460a99eb0d68522358720e1
COLLECT_GCC_OPTIONS='-v' '-o' 'bin/program' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 as -v --64 -o /tmp/ccQ1D3vL.o /tmp/ccRp0anL.s
Version de l'assembleur GNU 2.35.2 (x86_64-linux-gnu) utilisant la version BFD (GNU Binutils for Debian) 2.35.2
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/:/usr/lib/gcc/x86_64-linux-gnu/10/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/10/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/10/:/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/10/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'bin/program' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/10/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/10/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/10/lto-wrapper -plugin-opt=-fresolution=/tmp/ccKAHUjI.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o bin/program /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/10/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/10 -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/10/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/10/../../.. /tmp/ccQ1D3vL.o -lboost_log -lpthread -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/10/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/10/../../../x86_64-linux-gnu/crtn.o
/usr/bin/ld : /tmp/ccQ1D3vL.o : dans la fonction « main » :
main.cpp:(.text+0x11) : référence indéfinie vers « boost::log::v2s_mt_posix::trivial::logger::get() »
/usr/bin/ld : main.cpp:(.text+0x60) : référence indéfinie vers « boost::log::v2s_mt_posix::trivial::logger::get() »
/usr/bin/ld : /tmp/ccQ1D3vL.o : dans la fonction « boost::log::v2s_mt_posix::record::reset() » :
main.cpp:(.text._ZN5boost3log12v2s_mt_posix6record5resetEv[_ZN5boost3log12v2s_mt_posix6record5resetEv]+0x23) : référence indéfinie vers « boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*) »
/usr/bin/ld : /tmp/ccQ1D3vL.o : dans la fonction « boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_composite_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex>, boost::log::v2s_mt_posix::sources::features<boost::log::v2s_mt_posix::sources::severity<boost::log::v2s_mt_posix::trivial::severity_level> > >::open_record<boost::parameter::aux::tagged_argument_list_of_1<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> > >(boost::parameter::aux::tagged_argument_list_of_1<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> > const&) » :
main.cpp:(.text._ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux25tagged_argument_list_of_1INSJ_15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEEEENS1_6recordERKT_[_ZN5boost3log12v2s_mt_posix7sources22basic_composite_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEENS2_8featuresIJNS2_8severityIS6_EEEEEE11open_recordINS_9parameter3aux25tagged_argument_list_of_1INSJ_15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEEEENS1_6recordERKT_]+0x2d) : référence indéfinie vers « boost::log::v2s_mt_posix::core::get_logging_enabled() const »
/usr/bin/ld : /tmp/ccQ1D3vL.o : dans la fonction « boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::record_pump(boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>&, boost::log::v2s_mt_posix::record&) » :
main.cpp:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC2ERS8_RNS1_6recordE[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEEC5ERS8_RNS1_6recordE]+0x2f) : référence indéfinie vers « boost::log::v2s_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2s_mt_posix::record&) »
/usr/bin/ld : /tmp/ccQ1D3vL.o : dans la fonction « boost::log::v2s_mt_posix::aux::record_pump<boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level> >::auto_release::~auto_release() » :
main.cpp:(.text._ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEE12auto_releaseD2Ev[_ZN5boost3log12v2s_mt_posix3aux11record_pumpINS1_7sources18severity_logger_mtINS1_7trivial14severity_levelEEEE12auto_releaseD5Ev]+0x17) : référence indéfinie vers « boost::log::v2s_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2s_mt_posix::aux::stream_provider<char>::stream_compound*) »
/usr/bin/ld : /tmp/ccQ1D3vL.o : dans la fonction « boost::log::v2s_mt_posix::sources::aux::severity_level<boost::log::v2s_mt_posix::trivial::severity_level>::set_value(boost::log::v2s_mt_posix::trivial::severity_level) » :
main.cpp:(.text._ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_[_ZN5boost3log12v2s_mt_posix7sources3aux14severity_levelINS1_7trivial14severity_levelEE9set_valueES6_]+0x10) : référence indéfinie vers « boost::log::v2s_mt_posix::sources::aux::get_severity_level() »
/usr/bin/ld : /tmp/ccQ1D3vL.o : dans la fonction « boost::log::v2s_mt_posix::record boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >::open_record_unlocked<boost::parameter::aux::tagged_argument_list_of_1<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> > >(boost::parameter::aux::tagged_argument_list_of_1<boost::parameter::aux::tagged_argument<boost::log::v2s_mt_posix::keywords::tag::severity, boost::log::v2s_mt_posix::trivial::severity_level const> > const&) » :
main.cpp:(.text._ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux25tagged_argument_list_of_1INSF_15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEEEENS1_6recordERKT_[_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20open_record_unlockedINS_9parameter3aux25tagged_argument_list_of_1INSF_15tagged_argumentINS1_8keywords3tag8severityEKS6_EEEEEENS1_6recordERKT_]+0x3a) : référence indéfinie vers « boost::log::v2s_mt_posix::core::open_record(boost::log::v2s_mt_posix::attribute_set const&) »
/usr/bin/ld : /tmp/ccQ1D3vL.o : dans la fonction « boost::log::v2s_mt_posix::sources::basic_logger<char, boost::log::v2s_mt_posix::sources::severity_logger_mt<boost::log::v2s_mt_posix::trivial::severity_level>, boost::log::v2s_mt_posix::sources::multi_thread_model<boost::log::v2s_mt_posix::aux::light_rw_mutex> >::push_record_unlocked(boost::log::v2s_mt_posix::record&&) » :
main.cpp:(.text._ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20push_record_unlockedEONS1_6recordE[_ZN5boost3log12v2s_mt_posix7sources12basic_loggerIcNS2_18severity_logger_mtINS1_7trivial14severity_levelEEENS2_18multi_thread_modelINS1_3aux14light_rw_mutexEEEE20push_record_unlockedEONS1_6recordE]+0x43) : référence indéfinie vers « boost::log::v2s_mt_posix::core::push_record_move(boost::log::v2s_mt_posix::record&) »
collect2: error: ld returned 1 exit status
``

Non compatible.
La compilation de spdlog dans Debian 10 nécessite la version libspdlog-dev soit 1.3 de buster, ou 1.5 be backports.
Est-ce une bonne idée de rester sur buster pour faire une compilation : à clarifier.

apt show g++
Package: g++
Version: 4:10.2.1-1
Priority: optional
Build-Essential: yes
Section: devel
Source: gcc-defaults (1.190)
Maintainer: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Installed-Size: 15,4 kB
Provides: c++-compiler, g++-x86-64-linux-gnu (= 4:10.2.1-1)
Depends: cpp (= 4:10.2.1-1), gcc (= 4:10.2.1-1), g++-10 (>= 10.2.1-3~), gcc-10 (>= 10.2.1-3~)
Suggests: g++-multilib
Tag: devel::compiler, devel::lang:c, devel::lang:c++, devel::library,
 implemented-in::c, interface::commandline, role::devel-lib,
 role::dummy, role::metapackage, role::program, suite::gnu,
 works-with::software:source
Download-Size: 1 644 B
APT-Manual-Installed: no
APT-Sources: http://deb.debian.org/debian bullseye/main amd64 Packages
Description: compilateur C++ GNU
 Le compilateur C++ du projet GNU. Un compilateur C++ relativement portable
 et capable de bonnes optimisations.
 .
 Ceci est un paquet de dépendances qui fournit le compilateur GNU C++ par
 défaut.
apt show libspdlog-dev
Package: libspdlog-dev
Version: 1:1.8.1+ds-2.1
Priority: optional
Section: libdevel
Source: spdlog
Maintainer: Debian Med Packaging Team <debian-med-packaging@lists.alioth.debian.org>
Installed-Size: 528 kB
Depends: libspdlog1 (= 1:1.8.1+ds-2.1), libfmt-dev (>= 6.1.2+ds)
Homepage: https://github.com/gabime/spdlog
Tag: devel::library, role::devel-lib
Download-Size: 177 kB
APT-Manual-Installed: yes
APT-Sources: http://deb.debian.org/debian bullseye/main amd64 Packages
Description: Very fast, header only or compiled, C++ logging library
 Features: Very fast - performance is the primary goal; Headers only; No
 dependencies - just copy and use; call style using the excellent cppformat
 library; ostream call style is supported too; Optional extremely fast
 asynchronous mode - using lockfree queues and other tricks to reach millions
 of calls/sec; Custom formatting; Multi/Single threaded loggers; Easily
 extendable with custom log targets (just implement a single function in the
 sink interface). Severity based filtering - threshold levels can be modified
 in runtime as well as in compile time.
 .
 Various log targets:
 Rotating log files, Daily log files, Console logging, Linux syslog.

J’utilise les paquets par défaut que peut fournir debian. il est étonnant qu’ils ne soient pas compatible

N’y a t’il pas une erreur de la par de debian a faire remonté ?

Je ne possède pas la version 1.3 comment l’installé ?

apt-cache showpkg g++
Package: g++
Versions: 
4:10.2.1-1 (/var/lib/apt/lists/deb.debian.org_debian_dists_bullseye_main_binary-amd64_Packages) (/var/lib/dpkg/status)
 Description Language: 
                 File: /var/lib/apt/lists/deb.debian.org_debian_dists_bullseye_main_binary-amd64_Packages
                  MD5: 4d44b18774ae5123b7c3f70d940cf655
 Description Language: 
                 File: /var/lib/apt/lists/deb.debian.org_debian_dists_bullseye_main_binary-i386_Packages
                  MD5: 4d44b18774ae5123b7c3f70d940cf655
 Description Language: fr
                 File: /var/lib/apt/lists/deb.debian.org_debian_dists_bullseye_main_i18n_Translation-fr
                  MD5: 4d44b18774ae5123b7c3f70d940cf655
 Description Language: en
                 File: /var/lib/apt/lists/deb.debian.org_debian_dists_bullseye_main_i18n_Translation-en
                  MD5: 4d44b18774ae5123b7c3f70d940cf655

Je comprenais que tu partais des dernières sources de github que tu cites, et non du paquet -dev Debian.
De plus, spdlog peut être compilé en bibliothèque partagée ou non.
Si partagée, nécessitera l’installation du paquet libspdlog1 pour le binaire.
Pas compris la contradiction entre « Debian 10 » et tes paquets bullseye.
Sans rentrer dans le détail, juste une impression qu’une clarification de l’état précis de ton système s’impose dans un premier temps.

J’ai fait une machine virtuel Ubuntu qui ne contient rien de spéciale.
J’ai fait sudo apt install g++ libboost-all-dev
j’ai fait un programme minimum et lancé la compilation.

J’ai aussi testé avec glog et gtest de google → pas de problème
Avec boost ou sdplog → le linker foire a chaque fois

Tu ne veut pas essayer chez toi pour voir ? voici le code cpp que j’utilise (je l’ai renommé pour pouvoir l’envoyé direct dans le forum)
main.css (146 Octets)

C’est un concept trop compliqué pour moi, je n’arrive pas à suivre apt entre ubuntu, Debian 10 et bullseye. Désolé.

Ce qu’il manque accessoirement, c’est un CMakeLists.txt

spdlog fonctionne il faut faire :

g++ -c main.cpp -o app -lspdlog -lfmt 

pour boost je n’ai pas réussie a compilé mais bon je n’en ai plus besoin maintenant.