Forum: Compiler & IDEs CMake findet Header nicht


von Dr.Doof (Gast)


Lesenswert?

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.
1
$ cmake -D CMAKE_TOOLCHAIN_FILE=/home/drdoof/ARM.cmake ../
2
$ make
3
fatal error: gmp.h: Datei oder Verzeichnis nicht gefunden
4
 #include <gmp.h>

Meine toolchain-cmake sieht so aus:
1
# CMake toolchain file for building ARM software on OI environment
2
# this one is important
3
SET(CMAKE_SYSTEM_NAME Linux)
4
# specify the cross compiler
5
SET(CMAKE_C_COMPILER /opt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc)
6
SET(CMAKE_CXX_COMPILER /opt/gcc-arm-linux-gnueabi_linux/bin/arm-linux-gnueabi-gnueabi-g++)
7
SET(CMAKE_STRIP /opt/gcc-arm-linux-gnueabi_linux/bin/arm-linux-gnueabi-strip)
8
# where is the target environment
9
SET(CMAKE_FIND_ROOT_PATH /home/drdoof/armLibs/linux)
10
# 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?

von Rene H. (Gast)


Lesenswert?

in Dein toolchain-cmake:

1
set(CMAKE_INCLUDE_CURRENT_DIR ON)
2
set(INC_DIRS
3
   "${CMAKE_CURRENT_SOURCE_DIR}/blbla}"
4
   )
5
6
include_directories(${INC_DIRS})

Grüsse,
R.

von Dr.Doof (Gast)


Lesenswert?

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?

von Rene H. (Gast)


Lesenswert?

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.

von Fred (Gast)


Lesenswert?

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.

von Dr.Doof (Gast)


Lesenswert?

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.

von Rene H. (Gast)


Lesenswert?

Hast Du als root ein make install gemacht?

von Dr.Doof (Gast)


Lesenswert?

Hallo,

ich habe noch mal mein toolchain-cmake angehaengt:
1
# CMake toolchain file for building ARM software on OI environment
2
# this one is important
3
SET(CMAKE_SYSTEM_NAME Linux)
4
# specify the cross compiler
5
SET(CMAKE_C_COMPILER /opt/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc)
6
SET(CMAKE_CXX_COMPILER /opt/gcc-arm-linux-gnueabi_linux/bin/arm-linux-gnueabi-gnueabi-g++)
7
SET(CMAKE_STRIP /opt/gcc-arm-linux-gnueabi_linux/bin/arm-linux-gnueabi-strip)
8
9
# where is the target environment
10
SET(CMAKE_FIND_ROOT_PATH /home/drdoof/armLibs)
11
12
# 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?

von Rene H. (Gast)


Lesenswert?

Das geht, ist aber mühsam. Stichwort ccmake.

Grüsse,
R.

von Dr.Doof (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.