[g++/boost] Linker boost lors de la compilation (résolu)

Applications, problèmes de configuration réseau
elfangor
Hankyu
Messages : 23
Inscription : mer. 15 juil. 2009, 10:42

[g++/boost] Linker boost lors de la compilation (résolu)

Message par elfangor »

Bonjour,

Je commence à programmer en C++, ça me change de java et du PHP;)

J'ai déjà des bases correctes et cherche à développez une application réseau.
La librairie boost permet de faciliter grandement cela apparement.

Cepandant lorsque j'essaye de compiler le code suivant trouvé sur internet pour tester un peu:

Code : Tout sélectionner

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
boost::asio::io_service io; // Service principal
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); // Commence à compter dès sa création
t.wait(); // On attend que le timer expire
std::cout << "Terminé !" << std::endl;
return 0;
}	

j'obtiens

Code : Tout sélectionner

% g++ main2.cpp -o main2 -L/usr/include/boost -lboost_system                
/tmp/cc2eAi22.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::strand_service::strand_impl>::context>::posix_tss_ptr()':
main2.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEEC2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEEC5Ev]+0x26): undefined reference to `pthread_key_create'
/tmp/cc2eAi22.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::strand_service::strand_impl>::context>::~posix_tss_ptr()':
main2.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED5Ev]+0x15): undefined reference to `pthread_key_delete'
/tmp/cc2eAi22.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context>::posix_tss_ptr()':
main2.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEEC2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEEC5Ev]+0x26): undefined reference to `pthread_key_create'
/tmp/cc2eAi22.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context>::~posix_tss_ptr()':
main2.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEED5Ev]+0x15): undefined reference to `pthread_key_delete'
collect2: ld a retourné 1 code d'état d'exécution
Sur un autre programme j'obtiens

Code : Tout sélectionner

% g++ client.cpp -o client -L/usr/include/boost -lboost_system
/tmp/ccrCuHwM.o: In function `main':
client.cpp:(.text+0x2cb): undefined reference to `boost::thread::join()'
client.cpp:(.text+0x2da): undefined reference to `boost::thread::~thread()'
client.cpp:(.text+0x3db): undefined reference to `boost::thread::~thread()'
/tmp/ccrCuHwM.o: In function `boost::asio::detail::posix_thread::~posix_thread()':
client.cpp:(.text._ZN5boost4asio6detail12posix_threadD2Ev[_ZN5boost4asio6detail12posix_threadD5Ev]+0x26): undefined reference to `pthread_detach'
/tmp/ccrCuHwM.o: In function `boost::asio::detail::posix_thread::join()':
client.cpp:(.text._ZN5boost4asio6detail12posix_thread4joinEv[boost::asio::detail::posix_thread::join()]+0x2b): undefined reference to `pthread_join'
/tmp/ccrCuHwM.o: In function `boost::detail::thread_data_base::thread_data_base()':
client.cpp:(.text._ZN5boost6detail16thread_data_baseC2Ev[_ZN5boost6detail16thread_data_baseC5Ev]+0x24): undefined reference to `vtable for boost::detail::thread_data_base'
/tmp/ccrCuHwM.o: In function `boost::thread::thread<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >(boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > >, boost::disable_if<boost::is_convertible<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > >&, boost::detail::thread_move_t<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > > >, boost::thread::dummy*>::type)':
client.cpp:(.text._ZN5boost6threadC2INS_3_bi6bind_tImNS_4_mfi3mf0ImNS_4asio10io_serviceEEENS2_5list1INS2_5valueIPS7_EEEEEEEET_NS_10disable_ifINS_14is_convertibleIRSF_NS_6detail13thread_move_tISF_EEEEPNS0_5dummyEE4typeE[_ZN5boost6threadC5INS_3_bi6bind_tImNS_4_mfi3mf0ImNS_4asio10io_serviceEEENS2_5list1INS2_5valueIPS7_EEEEEEEET_NS_10disable_ifINS_14is_convertibleIRSF_NS_6detail13thread_move_tISF_EEEEPNS0_5dummyEE4typeE]+0x4f): undefined reference to `boost::thread::start_thread()'
/tmp/ccrCuHwM.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::strand_service::strand_impl>::context>::posix_tss_ptr()':
client.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEEC2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEEC5Ev]+0x26): undefined reference to `pthread_key_create'
/tmp/ccrCuHwM.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::strand_service::strand_impl>::context>::~posix_tss_ptr()':
client.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEED5Ev]+0x15): undefined reference to `pthread_key_delete'
/tmp/ccrCuHwM.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context>::posix_tss_ptr()':
client.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEEC2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEEC5Ev]+0x26): undefined reference to `pthread_key_create'
/tmp/ccrCuHwM.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context>::~posix_tss_ptr()':
client.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEED2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEED5Ev]+0x15): undefined reference to `pthread_key_delete'
/tmp/ccrCuHwM.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context>::operator boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context*() const':
client.cpp:(.text._ZNK5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEEcvPS8_Ev[boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context>::operator boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context*() const]+0x15): undefined reference to `pthread_getspecific'
/tmp/ccrCuHwM.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context>::operator=(boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context*)':
client.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_15task_io_serviceINS1_13epoll_reactorEEEE7contextEEaSEPS8_[boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context>::operator=(boost::asio::detail::call_stack<boost::asio::detail::task_io_service<boost::asio::detail::epoll_reactor> >::context*)]+0x20): undefined reference to `pthread_setspecific'
/tmp/ccrCuHwM.o: In function `boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >::~thread_data()':
client.cpp:(.text._ZN5boost6detail11thread_dataINS_3_bi6bind_tImNS_4_mfi3mf0ImNS_4asio10io_serviceEEENS2_5list1INS2_5valueIPS7_EEEEEEED2Ev[_ZN5boost6detail11thread_dataINS_3_bi6bind_tImNS_4_mfi3mf0ImNS_4asio10io_serviceEEENS2_5list1INS2_5valueIPS7_EEEEEEED5Ev]+0x1f): undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
/tmp/ccrCuHwM.o:(.rodata._ZTIN5boost6detail11thread_dataINS_3_bi6bind_tImNS_4_mfi3mf0ImNS_4asio10io_serviceEEENS2_5list1INS2_5valueIPS7_EEEEEEEE[typeinfo for boost::detail::thread_data<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >]+0x10): undefined reference to `typeinfo for boost::detail::thread_data_base'
collect2: ld a retourné 1 code d'état d'exécution

Je ne poste pas le code car il est un petit peu long et que je ne pense pas que le problème vienne de la, mais plus de ma façon de compiler.

Plus tard j'utiliserai des makefiles mais pour l'instant je veux tester à la "main", en attendant de lancer mon projet.

Ou est mon erreur? :)

Merci de votre aide ;)
Dernière modification par elfangor le mer. 01 sept. 2010, 00:20, modifié 1 fois.
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [g++/boost] Linker boost lors de la compilation (en cours)

Message par tuxce »

salut, rajoutes -lpthread
Avatar de l’utilisateur
chipster
Maître du Kyudo
Messages : 2063
Inscription : ven. 11 août 2006, 22:25
Localisation : Saint-Étienne (42)
Contact :

Re: [g++/boost] Linker boost lors de la compilation (en cours)

Message par chipster »

Il y a des exemples sur l'utilisation de boost sur le site même avec les règles de compilations, tout ça :wink:
elfangor
Hankyu
Messages : 23
Inscription : mer. 15 juil. 2009, 10:42

Re: [g++/boost] Linker boost lors de la compilation (en cours)

Message par elfangor »

Merci pour vos réponses ;)

J'ai tester le lpthread ça ne fonctionne pas, surement de ma faute ;)

J'essaye pour l'instant de me concentrer sur boost et asio, et donc de compiler le premier programme.

Je me suis servis de Boost pour compiler.

Code : Tout sélectionner

g++ main2.cpp -o main -I/usr/include/boost -L/usr/lib/ -lboost_system -lboost_asio
/usr/bin/ld: cannot find -lboost_asio
collect2: ld a retourné 1 code d'état d'exécution
A noter que si j'enleve lboost_asio j'ai une erreur:

Code : Tout sélectionner

/tmp/ccFotp1I.o: In function `boost::asio::detail::posix_tss_ptr<boost::asio::detail::call_stack<boost::asio::detail::strand_service::strand_impl>::context>::posix_tss_ptr()':
main2.cpp:(.text._ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEEC2Ev[_ZN5boost4asio6detail13posix_tss_ptrINS1_10call_stackINS1_14strand_service11strand_implEE7contextEEC5Ev]+0x26): undefined reference to `pthread_key_create'
D'après la doc c'est pourtant lboost_asio qui doit être indiqué. Or dans /usr/lib pas de référence à asio.
Apparement le pacquet AUR ne l'inclut pas? Il faut donc le compiler en utilisant bjam?

L'erreur viens de moi, le soucis c'est que c'est tellment peu clair pour moi que j'ai du mal a comprendre ce qui ne va pas. Bon je pense que je vais me replonger dans le base du C++, je mélange librairie, header ect... J'y verrais peut-être plus clair après :)

Mais si vous avez des infos n'hésitez pas ;)
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [g++/boost] Linker boost lors de la compilation (en cours)

Message par tuxce »

Le premier prog se compile très bien avec lpthread.

tu peux donner la commande et le résultat qu'on voit ce qui va pas avec lpthread?
elfangor
Hankyu
Messages : 23
Inscription : mer. 15 juil. 2009, 10:42

Re: [g++/boost] Linker boost lors de la compilation (en cours)

Message par elfangor »

Effectivement le premier programme ce compile très bien avec -lpthread :o Je n'avais pas compris que tu parlais de se programme la car dans le code source il n'y aucune reference au thread et donc pour moi pas besoin d'inclure cette librairie. Je crois que je n'ai vraiment pas du tout compris le principe de la prog en c++ la :o

Je pensais que tu parlais de se code (toujours pas de moi)

Code : Tout sélectionner

//
// chat_client.cpp
// ~~~~~~~~~~~~~~~
//
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//

#include <cstdlib>
#include <deque>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include "chat_message.hpp"

using boost::asio::ip::tcp;

typedef std::deque<chat_message> chat_message_queue;

class chat_client
{
public:
  chat_client(boost::asio::io_service& io_service,
      tcp::resolver::iterator endpoint_iterator)
    : io_service_(io_service),
      socket_(io_service)
  {
    tcp::endpoint endpoint = *endpoint_iterator;
    socket_.async_connect(endpoint,
        boost::bind(&chat_client::handle_connect, this,
          boost::asio::placeholders::error, ++endpoint_iterator));
  }

  void write(const chat_message& msg)
  {
    io_service_.post(boost::bind(&chat_client::do_write, this, msg));
  }

  void close()
  {
    io_service_.post(boost::bind(&chat_client::do_close, this));
  }

private:

  void handle_connect(const boost::system::error_code& error,
      tcp::resolver::iterator endpoint_iterator)
  {
    if (!error)
    {
      boost::asio::async_read(socket_,
          boost::asio::buffer(read_msg_.data(), chat_message::header_length),
          boost::bind(&chat_client::handle_read_header, this,
            boost::asio::placeholders::error));
    }
    else if (endpoint_iterator != tcp::resolver::iterator())
    {
      socket_.close();
      tcp::endpoint endpoint = *endpoint_iterator;
      socket_.async_connect(endpoint,
          boost::bind(&chat_client::handle_connect, this,
            boost::asio::placeholders::error, ++endpoint_iterator));
    }
  }

  void handle_read_header(const boost::system::error_code& error)
  {
    if (!error && read_msg_.decode_header())
    {
      boost::asio::async_read(socket_,
          boost::asio::buffer(read_msg_.body(), read_msg_.body_length()),
          boost::bind(&chat_client::handle_read_body, this,
            boost::asio::placeholders::error));
    }
    else
    {
      do_close();
    }
  }

  void handle_read_body(const boost::system::error_code& error)
  {
    if (!error)
    {
      std::cout.write(read_msg_.body(), read_msg_.body_length());
      std::cout << "\n";
      boost::asio::async_read(socket_,
          boost::asio::buffer(read_msg_.data(), chat_message::header_length),
          boost::bind(&chat_client::handle_read_header, this,
            boost::asio::placeholders::error));
    }
    else
    {
      do_close();
    }
  }

  void do_write(chat_message msg)
  {
    bool write_in_progress = !write_msgs_.empty();
    write_msgs_.push_back(msg);
    if (!write_in_progress)
    {
      boost::asio::async_write(socket_,
          boost::asio::buffer(write_msgs_.front().data(),
            write_msgs_.front().length()),
          boost::bind(&chat_client::handle_write, this,
            boost::asio::placeholders::error));
    }
  }

  void handle_write(const boost::system::error_code& error)
  {
    if (!error)
    {
      write_msgs_.pop_front();
      if (!write_msgs_.empty())
      {
        boost::asio::async_write(socket_,
            boost::asio::buffer(write_msgs_.front().data(),
              write_msgs_.front().length()),
            boost::bind(&chat_client::handle_write, this,
              boost::asio::placeholders::error));
      }
    }
    else
    {
      do_close();
    }
  }

  void do_close()
  {
    socket_.close();
  }

private:
  boost::asio::io_service& io_service_;
  tcp::socket socket_;
  chat_message read_msg_;
  chat_message_queue write_msgs_;
};

int main(int argc, char* argv[])
{
  try
  {
    if (argc != 3)
    {
      std::cerr << "Usage: chat_client <host> <port>\n";
      return 1;
    }

    boost::asio::io_service io_service;

    tcp::resolver resolver(io_service);
    tcp::resolver::query query(argv[1], argv[2]);
    tcp::resolver::iterator iterator = resolver.resolve(query);

    chat_client c(io_service, iterator);

    boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service));

    char line[chat_message::max_body_length + 1];
    while (std::cin.getline(line, chat_message::max_body_length + 1))
    {
      using namespace std; // For strlen and memcpy.
      chat_message msg;
      msg.body_length(strlen(line));
      memcpy(msg.body(), line, msg.body_length());
      msg.encode_header();
      c.write(msg);
    }

    c.close();
    t.join();
  }
  catch (std::exception& e)
  {
    std::cerr << "Exception: " << e.what() << "\n";
  }

  return 0;
}

Qui me donne une erreur avec les threads malgré lpthread.

Code : Tout sélectionner

g++ client.cpp -o client -L/usr/include/boost -lboost_system -lpthread
/tmp/ccYzRRPG.o: In function `main':
client.cpp:(.text+0x2cb): undefined reference to `boost::thread::join()'
client.cpp:(.text+0x2da): undefined reference to `boost::thread::~thread()'
client.cpp:(.text+0x3db): undefined reference to `boost::thread::~thread()'
/tmp/ccYzRRPG.o: In function `boost::detail::thread_data_base::thread_data_base()':
client.cpp:(.text._ZN5boost6detail16thread_data_baseC2Ev[_ZN5boost6detail16thread_data_baseC5Ev]+0x24): undefined reference to `vtable for boost::detail::thread_data_base'
/tmp/ccYzRRPG.o: In function `boost::thread::thread<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > >(boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > >, boost::disable_if<boost::is_convertible<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > >&, boost::detail::thread_move_t<boost::_bi::bind_t<unsigned long, boost::_mfi::mf0<unsigned long, boost::asio::io_service>, boost::_bi::list1<boost::_bi::value<boost::asio::io_service*> > > > >, boost::thread::dummy*>::type)':
client.cpp:(.text._ZN5boost6threadC2INS_3_bi6bind_tImNS_4_mfi3mf0ImNS_4asio10io_serviceEEENS2_5list1INS2_5valueIPS7_EEEEEEEET_NS_10disable_ifINS_14is_convertibleIRSF_NS_6detail13thread_move_tISF_EEEEPNS0_5dummyEE4typeE[_ZN5boost6threadC5INS_3_bi6bind_tImNS_4_mfi3mf0ImNS_4asio10io_serviceEEENS2_5list1INS2_5valueIPS7_EEEEEEEET_NS_10disable_ifINS_14is_convertibleIRSF_NS_6detail13thread_move_tISF_EEEEPNS0_5dummyEE4typeE]+0x4f): undefined reference to `boost::thread::start_thread()'
Vu que l'include spécifie boost/thread, je me suis dit qu'il fallais peut-être lboost_thread(d'après la doc de boost la structure est comme cela) mais malheuresement il me dit

Code : Tout sélectionner

/usr/bin/ld cannot find lboost_thread
Désolé pour ces questions qui doivent vous sembler idiotes :)
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [g++/boost] Linker boost lors de la compilation (en cours)

Message par tuxce »

http://www.boost.org/doc/libs/1_44_0/mo ... -libraries
Ce lien te donne la liste des fonctions qui ont besoin de librairies.

Pour ce qui est de retrouver les librairies, il suffit de:

Code : Tout sélectionner

ls /usr/lib/libboost_*.so
Le nom des librairies est expliqué dans le même lien.
Pour boost/thread.hpp par exemple, c'est -lboost_thread-mt
elfangor
Hankyu
Messages : 23
Inscription : mer. 15 juil. 2009, 10:42

Re: [g++/boost] Linker boost lors de la compilation (en cours)

Message par elfangor »

Merci pour ces explications, cela fonctionne maintenant et je comprend un peu mieux le principe!
Répondre