CMAKE cross compiler les bibliothèques ne sont pas trouvés
Je vais avoir des problèmes étranges avec mon cmake cross-compilateur projets.
Mes propres bibliothèques sont trouvés, mais pas le (système) les bibliothèques de ma chaîne.
Auparavant, j'ai été en utilisant KDevelop sur debian squeeze machine.
maintenant sur ma nouvelle machine avec debian wheezy, la configuration échoue.
Il ne trouve pas le système des bibliothèques comme m
ou pthread
.
Sur mon ancienne machine suivants fonctionnait parfaitement, mais je ne me souviens pas que j'ai fait quelque chose de spécial à faire ce travail.
Voici un de mes CMakeLists.txt
fichiers
cmake_minimum_required(VERSION 2.8)
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 2.6.36.4)
SET(CMAKE_C_COMPILER arm-angstrom-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER arm-angstrom-linux-gnueabi-g++)
include_directories(../include
../../../sample/include)
project(testmain)
add_executable(testmain
some_c-source-file.c)
set(CMAKE_LIBRARY_PATH ../lib/arm-26/lib
../../../sample/lib/arm-26/lib)
find_library(LIBS_TEST NAMES akku)
find_library(LIBS_M NAMES m)
find_library(LIBS_PTHREAD NAMES pthread )
target_link_libraries(akkumain
${LIBS_TEST}
${LIBS_M}
${LIBS_PTHREAD})
set(CMAKE_C_FLAGS "-Wall -Werror")
set(CMAKE_C_FLAGS_DEBUG "-g3 -O2 -rdynamic")
set(CMAKE_C_FLAGS_RELEASE "-g0 -O0")
set(CMAKE_CXX_FLAGS "-Wall -Werror")
set(CMAKE_CXX_FLAGS_DEBUG "-g3 -O2 -rdynamic")
set(CMAKE_CXX_FLAGS_RELEASE "-g0 -O0")
Ce message s'affiche lorsque vous essayez de compiler à l'aide de KDevelop: (me répéter: ce qui fonctionnait sur mon ancienne machine)
/home/user/testmain/build> /usr/bin/cmake -DCMAKE_BUILD_TYPE=Debug /home/user/testmain/
-- The C compiler identification is GNU 4.3.3
-- The CXX compiler identification is GNU 4.3.3
-- Check for working C compiler: /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-gcc
-- Check for working C compiler: /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-g++
-- Check for working CXX compiler: /usr/local/angstrom/arm/bin/arm-angstrom-linux-gnueabi-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
LIBS_M
linked by target "akkumain" in directory /home/user/testmain
LIBS_PTHREAD
linked by target "akkumain" in directory /home/user/testmain
Donc LIBS_TEST est trouvé. Mais pas libm
ou libpthread
.
J'ai essayé cela avec différents projets: Tous mes bibliothèques sont trouvés, mais aucun de le "système" des bibliothèques.
J'ai déjà essayé différentes choses comme
set(CMAKE_FIND_LIBRARY_PREFIXES lib )
set(CMAKE_FIND_LIBRARY_SUFFIXES .a )
et un peu plus de choses, je ne me souviens pas.
La seule chose qu'EST-ce que le TRAVAIL, c'est quand j'ai spécifier le répertoire manuellement:
find_library(ASTLIBS_M NAMES m PATHS /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr/lib)
Après l'indication de ce à mon CMakeLists.txt
la bibliothèque est trouvé et je peux compiler mon projet sans erreurs.
MAIS: Ce n'est pas ce que je veux, parce que j'ai un BEAUCOUP de projets et de nombreuses bibliothèques et je ne veux pas modifier tous mes CMakeLists.txt
... 🙁
Quelqu'un sait ce qu'a fait ma vieille machine de trouver le système-libs sans préciser quelque chose de spécial à l'intérieur de mon IDE/CMake fichiers?
Edit:
Je viens de remarquer qu'un de mes exécutables sur l'éditeur de liens stade, il jette quelques erreurs qu'il ne trouve pas certains symboles de la glibc semble qu'il y ait quelque chose en plus de mal avec ma debian wheezy système. - J'espère que je peux le comprendre...
Edit:
Je devrais peut-être donner un court résumé: Mon code compile bien, mais toutes les bibliothèques de mes outils ne sont pas trouvés, mais si j'ajoute le chemin d'accès à la bibliothèque de ma chaîne manuellement, il compile mais ne parvient pas à linker scène.
OriginalL'auteur Meister Schnitzel | 2013-07-18
Vous devez vous connecter pour publier un commentaire.
Il y a certains chemins d'accès par défaut où CMake est
find_library
module de recherche. Si votre système libs sur votre vieille machine se trouvent être situé dans l'un de ces, ils vont être trouvés sans aucun travail supplémentaire devant être faites.Cependant, comme votre nouvelle machine du chemin d'accès à ces libs semble être "/usr/local/angstrom/bras/bras-angstrom-linux-gnueabi/usr/lib", vous devez dire à CMake à ce sujet.
Une telle manière, est comme vous l'avez montré (ajout du chemin d'accès de manière explicite). Mais dans ce cas, le chemin est probablement spécifique à cette machine, alors vous feriez mieux de ne faire que de chemin d'accès lorsque vous appelez CMake sur cette machine. Vous pouvez l'ajouter à
CMAKE_PREFIX_PATH
par exemple:(Remarque: le chemin d'accès dans ce cas obtenir "lib" ajouté lors de la
find_library
est appelé).Ou si vous ne souhaitez affecter la
find_library
les chemins de recherche, et pas tousfind_xxx
modules, misCMAKE_LIBRARY_PATH
Je ne sais pas kdevelop, mais j'imagine qu'il y a un "configurer" option quelque part pour chaque projet. Il sera en invoquant CMake là-bas, et vous devriez être en mesure de passer des arguments supplémentaires à CMake.
Mieux vaut tard que jamais: tout Cela s'est terminé en place à l'aide de set(CMAKE_PREFIX_PATH ...) à l'intérieur de la CMakeliste.txt
OriginalL'auteur Fraser
Avez-vous déjà essayé d'utiliser un de la chaîne de fichier? J'ai aussi le cross-compiler pour BRAS et AVR un BEAUCOUP et il fonctionne très bien avec pas de soucis (j'utilise aussi KDevelop et il fonctionne à merveille avec CMake). Le point principal est de spécifier le chemin d'accès à votre chaîne de traitement de la racine du système de fichiers par le biais de la CMAKE_FIND_ROOT_PATH variable. Essayez de mettre tout cela dans un fichier, que j'ai l'habitude de nom après l'architecture, je suis à la cross-compilation (dans ce cas je l'ai appelé arm-unknown-linux-gnueabi.cmake):
Remarque les variables CMAKE_FIND_ROOT_PATH_MODE_xxx variables de contrôle où
CMake
va chercher les fichiers binaires, les bibliothèques et les fichiers d'en-tête. J'ai l'habitude de définir le PROGRAMME deNEVER
de sorte qu'il n'utilise jamais les fichiers binaires à partir de votre inter-architecture de système de fichiers racine, car ils ne vont pas s'exécuter sur votre machine hôte, de toute façon. Pour les bibliothèques et les fichiers d'en-têteBOTH
signifie qu'il recherche d'abord à votre spécifié ROOT_PATH et puis si il ne trouve pas quelque chose, il va parcourir votre ordinateur hôte système dirs.De cette façon, chaque fois que vous voulez le cross-compiler un projet tout ce que vous avez à faire est de créer un répertoire de construction (afin de ne pas mélanger vos sources avec les fichiers créés lors de la construction), puis exécutez cmake à partir de là, la spécification de la chaîne de traitement de fichier que vous souhaitez utiliser (je suis en supposant que votre
CMakeLists.txt
est avec votre chaîne d'outils fichier sur le même dir vos sources sont situées à l' - project_sources_dir dans mon exemple):Le point de l'ensemble de l'aide d'une chaîne de traitement de fichier, c'est que, si vous voulez compiler exactement le même projet pour votre machine hôte, vous n'avez pas à changer une seule ligne dans votre
CMakeLists.txt
. Il suffit d'exécuter cmake sans spécifier la chaîne de traitement du fichier:et votre projet est prêt pour la compilation native pour votre machine hôte à la place. Si vous n'en avez pas assez, vous pouvez trouver plus de détails ici sur CMake La Compilation Croisée
/usr/local/
mais vous voulez/opt/cross/
). Ce qui est plus de votre environnement de compilation croisée est également dans différents répertoires que/usr/
Ok. J'ai trouvé la solution:
SET(CMAKE_PREFIX_PATH /opt/cross/arm-unknown-linux-gnueabi)
à l'intérieur dearm-unknown-linux-gnueabi.cmake
OriginalL'auteur Claudio