IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

autoconf with boost test - linker issue


Sujet :

Boost C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 5
    Points : 4
    Points
    4
    Par défaut autoconf with boost test - linker issue
    Bonjour,

    Je rencontre un problème dans l'utilisation du framework unit_test de boost avec autoconf et automake.

    La structure du projet se présente en gros de la façon suivante:
    ./include/com_i_foo.h
    ./include/com_foo.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    ...
    class FooSingleton {
    protected:
    FooSingleton() {}
    private:
    FooSingleton* _instance;
    public:
    virtual ~FooSingleton() {}
    static FooSingleton* getInstance();
    };
     
    class FooFoo {
    public:
    FooFoo() {}
    virtual uint32_t getSomeInt();
    virtual ~FooFoo() {}
    };
    typedef boost::shared_ptr<FooFoo> FooFooPtr_t;
    ...
    ./include/com_api.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "com_foo.h"
    ./include/Makefile.am
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    include_HEADERS = \
            com_i_foo.h \
            com_foo.h \
            com_api.h \
            $(NULL)
    ./src/com_foo.cpp
    ./src/Makefile.am
    ./test/Makefile.am
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    PLATEFORM=LINUX64
    DEBUG_OPTIONS = -g
    DEFINE_OPTIONS=-D${PLATEFORM} -DBOOST_ENABLE_ASSERT_HANDLER
    OPTIONS = -Wall -Werror -O2 $(DEBUG_OPTIONS) $(DEFINE_OPTIONS)
     
    BOOST_LIBS = -lboost_unit_test_framework -lboost_locale -lboost_filesystem -lboost_system -lboost_thread
     
    COMMON_CXXFLAGS= ${OPTIONS} -I$(top_srcdir)/include -I$(top_srcdir)/src
    AM_LDFLAGS=
    ACLOCAL_AMFLAGS = -I ${top_builddir}/m4
     
    check_PROGRAMS = ut_com_api
     
    ut_com_api_SOURCES = \
            ut_com_api.cpp \
            $(NULL)
    ut_com_api_CXXFLAGS = ${COMMON_CXXFLAGS}
    ut_com_api_LDFLAGS = -rdynamic
    ut_com_api_LDADD = ${BOOST_LIBS} $(top_builddir)/src/libcom_api.la
    ./test/ut_com_api.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #define BOOST_LIB_DIAGNOSTIC
    #define BOOST_TEST_DYN_LINK
    #define BOOST_TEST_MODULE "Common API Unit tests"
     
    #include <boost/test/unit_test.hpp>
     
    #include "com_api.h"
     
    using namespace boost::unit_test;
     
    BOOST_AUTO_TEST_SUITE(com_api)
     
    BOOST_AUTO_TEST_CASE(FooFooTest) {
    FooFooPtr_t myFoo(new FooFoo());
    BOOST_CHECK(myFoo.getSomeInt() == 2);
    }
     
    BOOST_AUTO_TEST_CASE(FooSingletonTest) {
    FooSingleton* myFoo = FooSingleton::getInstance();
    BOOST_CHECK(myFoo != NULL);
    }
     
    BOOST_AUTO_TEST_SUITE_END()
    ./Makefile.am
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SUBDIRS = include src test
    #dist_doc_DATA = README
    ACLOCAL_AMFLAGS = -I m4
    ./configure.ac
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    AC_INIT([com_api], [1.0], [bug@foo.foo])
    AC_CONFIG_MACRO_DIR([m4])
    AM_INIT_AUTOMAKE([-Wall -Werror foreign])
    AC_PROG_LIBTOOL
    AC_PROG_CXX
    AC_LANG_PUSH(C++)
    AX_BOOST_BASE([1.53], ,[AC_MSG_ERROR([You need boost library])])
    AX_BOOST_PROGRAM_OPTIONS
    AX_BOOST_DATE_TIME
    AC_CHECK_HEADER([boost/shared_ptr.hpp], , [AC_MSG_ERROR([You need boost library])])
    AC_LANG_POP(C++)
    AC_CONFIG_HEADERS([config.h])
    AC_CONFIG_FILES([
    Makefile
    include/Makefile
    src/Makefile
    test/Makefile
    ])
    AC_OUTPUT
    Lorsque je builde la DLL (.so sous linux), ça fonctionne parfaitement, mais lorsque je tente de builder le check_PROGRAM, le linker me retourne des undefined reference:
    undefined reference to FooSingleton::_instance
    undefined reference to boost::assertion_failed(char const*, char const*, char const*, long)

    Pour le FooSingleton je ne comprends pas car je link bien avec le .la.

    Pour boost, j'imagine qu'il me manque un -lboost_xxxx mais je ne comprends pas non-plus pourquoi je suis obligé de spécifier les libs boost au linker pour le check_PROGRAM, alors que ça fonctionne parfaitement avec la lib...

    J'ai cherché un peu partout sans succès et je suis un peu à court d'idées, merci d'avance pour votre aide!

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,

    C'est pour la simple raison que linux accepte de retarder la recherche des symboles non définis jusqu'au moment où ils sont utilisés depuis la dll (enfin, le so).

    Tu peux donc sans problème créer une bibliothèque dynamique qui est liée à une autre bibliothèque dynamique absente de ton système sans que cela ne pose de problème.

    Par contre, une fois que tu créeras application qui fait appel à ta bibliothèque dynamique personnelle, si elle fait appel à des symboles qui sont présent dans la bibliothèque externe, l'éditeur de liens ira chercher tous les symboles dont il a besoin, en ce, y compris ceux qui se trouvent dans la bibliothèque externe

    C'est la raison pour laquelle il y a lieu de vérifier la présence non seulement des fichiers d'en-tête de boost, mais aussi de vérifier la présence des bibliothèques que tu utilises, ou du moins, de celles qui ne sont pas "headers only"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. autoconf with boost test - linker issue
    Par syffys dans le forum C++
    Réponses: 0
    Dernier message: 30/03/2013, 22h41
  2. [Boost.test] utiliser la suite par default
    Par TabrisLeFol dans le forum Boost
    Réponses: 6
    Dernier message: 19/05/2008, 14h57
  3. Comment faire des test avec boost::test
    Par cdm1024 dans le forum Boost
    Réponses: 5
    Dernier message: 19/02/2008, 19h37
  4. boost test : comment ajouter du code au main ?
    Par ch4mp dans le forum Boost
    Réponses: 2
    Dernier message: 15/02/2008, 14h59
  5. Boost.Test : organisation en modules
    Par ch4mp dans le forum Boost
    Réponses: 2
    Dernier message: 04/01/2008, 20h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo