Bonjour à tous,
Je suis en train de travailler sur la remise a plat de la compilation d'un projet en C/C++. On compile tout avec g++ et je suis en train de faire une migration vers cmake (on était anciennement sur un mélange makefile, cmake, script shell et script visual script). J'ai rencontré un problème important lors d'une étape de linkage. g++ me renvoyait plein d'erreur de références non définies liées à boost.
J'ai réussi à trouver que le problème venait de l'ordre des flags. Si je mets les flags de link de bibliothèque avant la liste des fichier .o, ça plante, si je les mets après, ça compile bien.
Première question, pourquoi ? Quel est l'impact de l'ordre des éléments sur la ligne de compile sur le fait que ça link correctement avec boost ?
Deuxième question, comment en utilisant cmake je peux influencer l'ordre des éléments dans les commandes de compilation? Car pour l'instant, il me mets toujours tout mes flags devant, puis tous les fichiers à utiliser pour le linkage?
Pour info, voilà les lignes de commandes qui posent problème (enfin, surtout la première, la 2e étant celle qui marche) :
Ligne qui marche
/usr/bin/ccache g++ -o executable -L/home/babcool/Projet/workspace_c/kernel/CMake/newVersion/../../src/../libs/boost1_49_0/lib -lboost_filesystem -lboost_program_options -lboost_system -lrt -lpthread -m32 <liste des fichiers.o>
Ligne qui ne marche pas (état actuel généré par le cmake)
/usr/bin/ccache g++ <liste des fichiers.o > -o executable -L/home/babcool/Projet/workspace_c/kernel/CMake/newVersion/../../src/../libs/boost1_49_0/lib -lboost_filesystem -lboost_program_options -lboost_system -lrt -lpthread -m32
Quelques infos en plus, la compilation en mode 32 bits est volontaire et nécessaire, les fichiers boost qu'on a sont compilé en mode 32 bits uniquement (vérifié avec objdump).
Merci d'avance pour vos lumières (et vos idées concernant le problème lié à cmake).
Babcool
EDIT après résolution :
Voir les 3 derniers messages. Il ne faut pas mettre le -l avant les .o qui l'utilisent.
Mots clés : cmake bibliothèque undefined reference ordre flag import library
Partager