Ich kann nicht auf cairo.h zugreifen

7

Ich habe cairo-1.4.14 mit installiert make install, aber nachdem ich versucht habe, meinen Code zu kompilieren:

fatal error: cairo.h: No such file or directory
 #include <cairo.h>
                   ^

Ich kompiliere damit:

g++ screenshot.cpp

Ich habe 3 Pakete von dieser Ausgabe installiert, aber immer noch das gleiche Problem:

apt-file search --regex /cairo.h$
libcairo2-dev: /usr/include/cairo/cairo.h
r-cran-rgtk2: /usr/lib/R/site-library/RGtk2/include/RGtk2/cairo.h
thunderbird-dev: /usr/include/thunderbird/cairo/cairo.h

Info zum System:

lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.3 LTS
Release:    14.04
Codename:   trusty

Ausgabe von pkg-config --libs --cflags cairo:

-I/usr/local/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12  -L/usr/local/lib -lcairo
RS
quelle
Sie benötigen die .h-Datei in Ihrem Verzeichnis.
Star OS
2
Bitte bearbeiten Sie die Frage und fügen Sie wesentliche Teile hinzu. Beispiel: Wie kompilieren Sie? siehe askubuntu.com/help/how-to-ask
user.dz
1
@ Star OS, wenn ich "cairo.h" geschrieben hätte, dann sollte es in meinem Verzeichnis sein.
RS
1
@ Star OS zu welchem ​​Zweck habe ich dann die Bibliothek in meinem System installiert, ich möchte nicht, dass es so ist.
RS
2
Die Ausgabe vonpkg-config --libs --cflags cairo
AB

Antworten:

5

Befolgen Sie die Antwort von AB, es sei denn, Sie benötigen eine andere Version von Kairo als Ubuntu.

Wenn Sie das manuell installierte Kairo verwenden möchten, gehen Sie wie folgt vor.

Das Problem ist , dass libcairo installiert sein cairo.hauf /usr/local/include/cairo/und nicht /usr/local/include/(dh ein Verzeichnis tiefer)

Sie müssen dieses Verzeichnis mit dem -ISwitch an den Compiler übergeben .

g++ -I/usr/local/include/cairo/ -o screenshot screenshot.cpp

Dann wird wahrscheinlich ein Linkerfehler auftreten - der Linker weiß nicht, ob er nach libcairo und Fehlern bei nicht aufgelösten Symbolen suchen soll. Geben wir also noch g++ein paar Parameter an.

g++ -I/usr/local/include/cairo/ -L/usr/local/lib -o screenshot screenshot.cpp -lcairo

-lcairoWeist den Linker an, nach einer aufgerufenen Bibliothek zu suchen, cairound -L/usr/local/libgibt dem Linker ein zusätzliches Verzeichnis zum Suchen.

Beachten Sie, dass die Reihenfolge der Parameter von Bedeutung ist -l- sie sollte nach den Quell- oder Objektdateien platziert werden. [1] (In diesem Fall nach screenshot.cpp)

Dies sollte ausreichen, um Ihre Binärdatei zu kompilieren.


pkg-configist ein Werkzeug zur Automatisierung dieser Dinge. Sie erhalten die Befehlszeilenparameter, die zum Kompilieren eines Programms mit einer bestimmten Bibliothek erforderlich sind. Ich denke, es überschreitet oft und führt zu Verknüpfungen mit mehreren Bibliotheken, die eigentlich nicht benötigt werden. Der manuelle Weg ist in dieser Angelegenheit besser.


[1] Zumindest denke ich. Ich kann ehrlich gesagt nicht verstehen, was diese Handbuchseite von GCC zu sagen versucht.

oals
quelle
g++ -I/usr/local/include/cairo/ -L/usr/local/lib -lcairo -lX11 screenshot.cpp /tmp/ccvzQc8U.o: In function `main': screenshot.cpp:(.text+0x15): undefined reference to `XOpenDisplay' screenshot.cpp:(.text+0x83): undefined reference to `cairo_xlib_surface_create' screenshot.cpp:(.text+0x98): undefined reference to `cairo_surface_write_to_png' screenshot.cpp:(.text+0xa4): undefined reference to `cairo_surface_destroy'
RS
und warum "gegen mehrere Bibliotheken" - wenn ich eine Bibliothek spezifiziere?
RS
@RS pkg-configkann bei einem einzigen Aufruf mehrere Bibliotheken zurückgeben. pkg-config --libs gtk+-2.0gibt zum Beispiel 14 Bibliotheken für mich zurück.
Oals
@oals cpp Sie sollten den Dateinamen vor den Optionen platzieren. Aus diesem Grund konnte ich Ihren Befehl nicht ausführen.
RS
@RS Okay, behoben.
Oals
8

apt-file search gibt die Informationen

$ apt-file search --regex  /cairo.h$
libcairo2-dev: /usr/include/cairo/cairo.h

Aus diesem Grund ausführen

sudo apt install libcairo2-dev

und kompilieren mit

g++ screenshot.cpp $(pkg-config --libs --cflags cairo)
AB
quelle
Frage ist aktualisiert
RS
Ich denke, Sie sollten in Ihrer Antwort erwähnen, dass es einige unnötige Bibliotheken ziehen wird.
RS
@RS Ich denke, Sie sind auch nach der langen Diskussion über die andere Frage noch ein bisschen verwirrt. Die -IFlags von pkg-config werden nur zum Suchpfad für Include-Dateien hinzugefügt. Diese sind harmlos, egal wie viele es gibt. Nur das -lFlag verknüpft Bibliotheken. Und pkg-config gibt nur einen einzigen -lAufruf für cairo zurück. Welches ist genau die richtige Menge.
Oals
@oals Was versuchst du dann im letzten Absatz deiner Antwort zu sagen?
RS
"Wenn dies zu komplex klingt, können Sie stattdessen pkg-config verwenden. Ich denke jedoch nicht, dass es immer optimal ist." [Bei Kairo ist es zufällig optimal. es kann für andere anders sein. gtk2 ist ein Beispiel, wo es anders ist.]
oals