CMAKE-cross-kompilieren der libraries werden nicht gefunden
Ich habe seltsame Probleme mit meinen cmake-cross-compiler-Projekte.
Meine eigenen Bibliotheken gefunden, aber nicht die (system -) Bibliotheken aus meiner toolchain.
Zuvor war ich mit KDevelop auf debian squeeze-Maschine.
jetzt auf meinem neuen Rechner mit debian wheezy konfigurieren, schlägt fehl.
Es nicht die system-Bibliotheken wie m
oder pthread
.
Auf meiner alten Maschine die folgenden arbeiten war perfekt, aber ich erinnere mich nicht, dass ich etwas besonderes um diese Arbeit zu machen.
Hier ist einer meiner CMakeLists.txt
Dateien
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")
Dies ist die Meldung, wenn Sie versuchen, kompilieren Sie mit KDevelop: (, mich zu wiederholen: es funktioniert auf meinem alten Rechner)
/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
So LIBS_TEST gefunden wird. Aber nicht libm
oder libpthread
.
Ich versuchte dies mit verschiedenen Projekten: Alle meine Bibliotheken gefunden werden, aber keiner von den "system" - Bibliotheken.
Ich schon verschiedene Sachen ausprobiert wie
set(CMAKE_FIND_LIBRARY_PREFIXES lib )
set(CMAKE_FIND_LIBRARY_SUFFIXES .a )
und einige weitere Dinge, die ich mich nicht erinnern.
Das einzige was FUNKTIONIERT ist, wenn ich geben Sie das Verzeichnis manuell:
find_library(ASTLIBS_M NAMES m PATHS /usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr/lib)
Nachdem Sie diese auf meine CMakeLists.txt
der Bibliothek gefunden, und ich kann mein Projekt kompilieren ohne Fehler.
ABER: Das ist nicht das, was ich will, weil ich eine VIEL von Projekten und viele Bibliotheken, und ich will nicht Bearbeiten, alle meine CMakeLists.txt
... 🙁
Weiß jemand, was aus meiner alten Maschine finden, die system-libs, ohne Angabe irgendetwas besonderes in meinem IDE/CMake-Dateien?
Bearbeiten:
Mir gerade aufgefallen ist, für eine meiner ausführbare Dateien, die auf Linker Bühne wirft es einige Fehler, die es nicht finden können, einige Symbole aus der glibc - scheint, es ist etwas falsch mit meinem debian-wheezy-system. - Ich hoffe, dass ich es herausfinden...
Edit:
Vielleicht sollte ich geben eine kurze Zusammenfassung: Mein code kompiliert auch, aber alle Bibliotheken aus meiner toolchain nicht gefunden, aber wenn ich den Pfad zu den libs von meiner toolchain manuell kompiliert, aber scheitert an linker Bühne.
InformationsquelleAutor Meister Schnitzel | 2013-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es bestimmte Standard-Pfade, in denen CMake ist
find_library
Modul sucht. Wenn Ihr system libs auf der alten Maschine passieren, um sich in eine solche Stelle, Sie werden gefunden werden, ohne weitere arbeiten, welche erledigt werden.Jedoch, wie Ihre neue Maschine der Pfad zu den libs zu sein scheint: "/usr/local/angstrom/arm/arm-angstrom-linux-gnueabi/usr/lib", wirst du sagen müssen, CMake dazu.
Einer solchen Art und Weise, wie Sie gezeigt haben (hinzufügen den Pfad explizit). Aber in diesem Fall, der Weg ist wahrscheinlich spezifisch für die Maschine - so dass Sie würde besser, wenn nur der Satz, dass der Pfad beim Aufruf von CMake auf, die Maschine. Sie können es hinzufügen, um
CMAKE_PREFIX_PATH
zum Beispiel:(Hinweis: der Pfad in diesem Fall erhalten "lib" Hinzugefügt werden, wenn
find_library
genannt wird).Oder wenn Sie nur wollen, um Einfluss auf die
find_library
Suchpfade, und nicht allefind_xxx
- Module, SatzCMAKE_LIBRARY_PATH
Ich weiß nicht, kdevelop, aber ich glaube, es gibt einen "konfigurieren" - option irgendwo für jedes Projekt. Es wird CMake aufrufen, und Sie sollten in der Lage sein, um pass zusätzliche Argumente für CMake gibt.
Besser spät als nie: alles endete mit set(CMAKE_PREFIX_PATH ...) innerhalb der CMakeliste.txt
InformationsquelleAutor Fraser
Haben Sie jemals versucht, mit einer toolchain-Datei? Ich habe auch das cross-kompilieren für ARM und AVR ein VIEL und es funktioniert sehr gut mit keine Probleme (ich benutze KDevelop und es funktioniert wunderbar zusammen mit CMake). Der wichtigste Punkt ist die Angabe der Pfad zur toolchain root-Dateisystem durch die CMAKE_FIND_ROOT_PATH variable. Versuchen Sie, all dies in eine Datei, die ich in der Regel nach dem Namen der Architektur bin ich cross-compiling (in diesem Fall nannte ich es arm-unknown-linux-gnueabi.cmake):
Hinweis: die Variablen CMAKE_FIND_ROOT_PATH_MODE_xxx Variablen Steuern, wo
CMake
wird, sucht die binaries, libraries und header-Dateien. Ich in der Regel PROGRAMMNEVER
so dass es nie verwendet Binärdateien, die aus Ihrer cross-Architektur-root-Dateisystem, da laufen Sie nicht auf Ihrem host-Rechner sowieso. Für Bibliotheken und header-DateienBOTH
bedeutet, es wird, suchen Sie zuerst die von Ihnen angegebene ROOT_PATH und dann, wenn es nicht etwas finden, wird es gehen durch Ihre host-Maschine-system dirs.So, Wann immer Sie wollen, um cross-kompilieren eines Projekts alle Sie tun müssen ist, erstellen Sie eine build-Verzeichnis (so dass es nicht mischen Sie Ihre Quellen mit den erstellten Dateien während des build) und führen Sie dann cmake von dort die Angabe der toolchain-Datei, die Sie verwenden möchten (ich bin angenommen, dass Ihre
CMakeLists.txt
ist zusammen mit Ihrer toolchain-Datei auf dem gleichen dir Ihren Quellen zu finden sind - project_sources_dir in meinem Beispiel):Die ganze Punkt, der mit einer toolchain-Datei ist, dass, wenn Sie wollen, kompilieren Sie das exakt gleiche Projekt für Ihre host-Maschine, Sie müssen nicht zum ändern einer einzelnen Zeile in der
CMakeLists.txt
. Führen Sie einfach cmake ohne Angabe der toolchain-Datei:- und Ihr Projekt ist bereit für das kompilieren von native für Ihr host-Rechner statt. Wenn all das nicht genug ist, kann man sich weitere details hier auf CMake-Cross-Compilierung
/usr/local/
aber Sie wollen/opt/cross/
). Was ist der cross-compiler ist auch in anderen Verzeichnis als/usr/
Ok. Ich fand die Lösung:
SET(CMAKE_PREFIX_PATH /opt/cross/arm-unknown-linux-gnueabi)
innenarm-unknown-linux-gnueabi.cmake
InformationsquelleAutor Claudio