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
pkg-config --libs --cflags cairo
Antworten:
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.h
auf/usr/local/include/cairo/
und nicht/usr/local/include/
(dh ein Verzeichnis tiefer)Sie müssen dieses Verzeichnis mit dem
-I
Switch an den Compiler übergeben .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.-lcairo
Weist den Linker an, nach einer aufgerufenen Bibliothek zu suchen,cairo
und-L/usr/local/lib
gibt 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 nachscreenshot.cpp
)Dies sollte ausreichen, um Ihre Binärdatei zu kompilieren.
pkg-config
ist 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.
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'
pkg-config
kann bei einem einzigen Aufruf mehrere Bibliotheken zurückgeben.pkg-config --libs gtk+-2.0
gibt zum Beispiel 14 Bibliotheken für mich zurück.apt-file search
gibt die InformationenAus diesem Grund ausführen
und kompilieren mit
quelle
-I
Flags von pkg-config werden nur zum Suchpfad für Include-Dateien hinzugefügt. Diese sind harmlos, egal wie viele es gibt. Nur das-l
Flag verknüpft Bibliotheken. Und pkg-config gibt nur einen einzigen-l
Aufruf für cairo zurück. Welches ist genau die richtige Menge.