2017-07-20 1 views
0

Je pensais avoir compris assez bien cmake jusqu'à ce que je suis venu à travers ce problème que je ne peux pas comprendre. J'ai construit une bibliothèque statique en C, et j'essaie de lancer un test unitaire en C++, mais je n'arrive pas à lier l'une des fonctions statiques de cette bibliothèque et je n'arrive pas à comprendre pourquoi . J'ai reproduit le problème dans le projet de squelette ci-dessous:Lier un C++ exe à un C lib dans cmake

CMakeLists.txt:

cmake_minimum_required(VERSION 3.6) 
project(myproj) 

add_library(mylib STATIC mylib.c) 

find_package(Boost 1.64.0 COMPONENTS unit_test_framework) 

add_executable(mytestapp mytest.cpp) 
target_include_directories(mytestapp PRIVATE .) 
target_link_libraries(mytestapp mylib) 

enable_testing() 
add_test(mytest mytestapp) 

mylib.c:

int add(int a, int b) 
{ 
    return a + b; 
} 

malib.h

int add(int a, int b); 

mytest. cpp:

#define BOOST_TEST_MODULE mylib_test 
#include <boost/test/included/unit_test.hpp> 
#include "mylib.h" 

BOOST_AUTO_TEST_CASE(mylib_test) 
{ 
    BOOST_TEST(add(2,2) == 4); 
} 

Alors ma sortie est:

$ make 
Scanning dependencies of target mylib 
[ 25%] Building C object CMakeFiles/mylib.dir/mylib.c.o 
[ 50%] Linking C static library libmylib.a 
[ 50%] Built target mylib 
Scanning dependencies of target mytestapp 
[ 75%] Building CXX object CMakeFiles/mytestapp.dir/mytest.cpp.o 
[100%] Linking CXX executable mytestapp 
CMakeFiles/mytestapp.dir/mytest.cpp.o: In function `mylib_test::test_method()': 
mytest.cpp:(.text+0x1e411): undefined reference to `add(int, int)' 
collect2: error: ld returned 1 exit status 
make[2]: *** [CMakeFiles/mytestapp.dir/build.make:96: mytestapp] Error 1 
make[1]: *** [CMakeFiles/Makefile2:105: CMakeFiles/mytestapp.dir/all] Error 2 
make: *** [Makefile:95: all] Error 2 

Si je compile mylib en C++, il lie bien, mais pas dans C. C'est un problème pour moi parce que j'ai une bibliothèque énorme dans C et je suis en train utiliser boost_test_framework (en C++) pour charger cette lib et la tester.

+0

double possible de (https://stackoverflow.com/questions/12573816/what-is-an-defined-reference-unresolved-external-symbol-error-and-how-do-i-fix) – Olaf

+0

Pas un doublon, le problème est transversal la langue. Fonctionne bien si je fais everytrhing en C++. Et pourquoi le downvote? – Stewart

+0

Apparemment, c'est un doublon. Si vous ne comprenez pas pourquoi et les réponses, vous devriez faire quelques recherches. Nous ne sommes pas un service de tutorat ou de débogage. Et ce n'est pas lié aux langages C ou C++, mais aux liens. Ne pas spammer les tags. – Olaf

Répondre

0

Solution:

je avais besoin d'importer la bibliothèque extern "C" comme ceci: [? Qu'est-ce qu'une erreur de symbole externe de référence non défini/non résolue et comment puis-je fixer]

#define BOOST_TEST_MODULE mylib_test 
#include <boost/test/included/unit_test.hpp> 

extern "C" { 
    #include "mylib.h" 
} 

BOOST_AUTO_TEST_CASE(mylib_test) 
{ 
    BOOST_TEST(add(2,2) == 4); 
}