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.
double possible de (https://stackoverflow.com/questions/12573816/what-is-an-defined-reference-unresolved-external-symbol-error-and-how-do-i-fix) – Olaf
Pas un doublon, le problème est transversal la langue. Fonctionne bien si je fais everytrhing en C++. Et pourquoi le downvote? – Stewart
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