Hallo,
ich habe eine CMake Projekt, das ich für ARM cross-compilieren will.
Das Projekt benötigt gmp.h.
GMP habe ich im Voraus "quer-kompiliert", so das ich libgmp.a habe. War
das richtig, oder sollte ich GMP gleich mitsamt dem Hauptprojekt
compilieren; also den src-code von GMP der CMake-file mitgeben?
Naja, jetzt habe ich also libgmp.a, make findet aber <gmp.h> nicht.
# search for programs in the build host directories
11
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
12
# for libraries and headers in the target directories
13
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
14
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Ich habe auch schon probiert mit SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
/path/to/gmp.h) direkt auf die gmp.h zu zeigen, aber das war auch nicht
richtig.
Wer weiß, wie ich gmp.h sauber eingebunden kriege?
Gut, danke, das hat erstmal geklappt.
Ganz sauber ist mein Bauvorgang aber noch nicht, denn jetzt sucht er
auch config.h in /pfad/zu/gmp.h
Ich koennte die config.h natuerlich einfach dort hin kopieren, aber ich
mag so gehacke nicht.
Also, es gibt wohl zwei Moeglichkeiten. Entweder die CMakefile ist noch
nicht genau genug. Oder - was ich eher vermute - ich habe die libgmp.a
nicht sauber erstellt oder eingebunden. Denn wenn ich eine lib*.a habe,
muss ich dem Compiler dann ueberhaupt die *.h noch mitgeben? Oder sollte
er sich die aus der lib*.a nicht einfach ableiten koennen?
Dr.Doof schrieb:> Denn wenn ich eine lib*.a habe,> muss ich dem Compiler dann ueberhaupt die *.h noch mitgeben? Oder sollte> er sich die aus der lib*.a nicht einfach ableiten koennen
Ja, das musst Du natürlich. In der Library sind ja die Funktionen, die
Header Datei ist lediglich ein Beschrieb dazu.
Poste doch mal Dein ganzes CMakefile und alle Dateienname und deren
Pfade die Du zusammen kompiliert haben willst. Dann kann man Dir helfen.
Grüsse,
R.
Nachtrag: ich vermute mal, dass die Config.h von der libgmp stammt. Also
macht es mehr Sinn, auf das Include Verzeichnis der libgmp.a zu
verweisen. Und überhaupt, rumkopieren wäre wirklich murks.
Dr.Doof schrieb:> Denn wenn ich eine lib*.a habe,> muss ich dem Compiler dann ueberhaupt die *.h noch mitgeben? Oder sollte> er sich die aus der lib*.a nicht einfach ableiten koennen?
"Er" ist in Wirklichkeit "sie" (Plural), nämlich zwei getrennte Teile:
Linker und Compiler.
Der Compiler braucht nur die Headerdatei.
Der Linker braucht nur die Lib selbst.
Da du beide Teile aufrufst, um ein lauffähiges Programm zu erhalten,
mußt du auch beides, Lib wie Header, übergeben.
Rene H. schrieb:> Nachtrag: ich vermute mal, dass die Config.h von der libgmp stammt. Also> macht es mehr Sinn, auf das Include Verzeichnis der libgmp.a zu> verweisen. Und überhaupt, rumkopieren wäre wirklich murks.
Tatsaechlich habe ich auf gmp/src verwiesen, wo auch eine config.h drin
ist. Da hat er sich verschluckt.
libgmp.a wurde cross-compiliert, und deshalb wurde nichts in
/usr/include geschrieben. (Oder ging der Bauprozess schief? Ich sehe
zumindest keine errors...)
Naja, ich habe jetzt einen Ordner "include" erstellt und libgmp.a &
gmp.h dort hineinkopiert. Fuer's erste geht's...
Vielen Dank.
# search for programs in the build host directories
13
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
14
# for libraries and headers in the target directories
15
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
16
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Tatsaechlich habe ich unter /home/drdoof/armLibs (CMAKE_FIND_ROOT_PATH)
die Ordner lib/, share/ und include/, die alle Header und libs
enthalten. Aber der Pfad wird nicht in die Makefiles eingebaut; weder
als -I noch -L (gcc-flag).
Ich habe zwar einen Bug-Report gefunden, aber bei mir funktioniert gar
keine cmake Version.
http://www.cmake.org/Bug/view.php?id=14337
Ist das bei mir ein Bug oder falsche Bedienung?
Abgesehen davon wuerde ich gerne am CMAKE-Prozess rumdoktor, ohne die
urspruenglichen CMakeList.txt zu aendern. Also, zB die
include_directories(/opt/local/include),
link_directories(/opt/local/lib) und add_subdirectory(foo) von der
Konsole bzw. meiner toolchain.cmake aus ueberschreiben. Geht das?
Ich weiss, dass ich Pfade hinzufuegen kann, aber kann ich auch Sachen
herausnehmen? zB remove_subdirectories(foo).
Oder muss ich direkt in der urspruenglichen CMakeList.txt Aenderungen
vornehmen?
Hmm ich habe jetzt ein bisschen rumprobiert, aber nur Fehlermeldungen
erhalten. Schade, aber mehr Zeit kann ich in diese - meiner Meinung nach
- schoene Loesung nicht mehr reinbringen.
Und du meinst, die CMakeList direkt umzuschreiben ist der einfachere
Weg?
Was ist mit meiner ersten Frage oben?
> (CMAKE_FIND_ROOT_PATH)> Ist das bei mir ein Bug oder falsche Bedienung?
Danke