我已经使用 安装了 cairo-1.4.14 make install
,但是在尝试编译我的代码后:
fatal error: cairo.h: No such file or directory
#include <cairo.h>
^
我使用这个进行编译:
g++ screenshot.cpp
我从这个输出安装了 3 个包,但仍然存在同样的问题:
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
系统信息:
lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.3 LTS
Release: 14.04
Codename: trusty
输出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
答案1
apt-file search
提供信息
$ apt-file search --regex /cairo.h$
libcairo2-dev: /usr/include/cairo/cairo.h
因为执行
sudo apt install libcairo2-dev
并编译
g++ screenshot.cpp $(pkg-config --libs --cflags cairo)
答案2
除非您需要与 Ubuntu 提供的版本不同的 Cairo 版本,否则请遵循 AB 的回答。
如果您想使用手动安装的Cairo,请执行以下操作。
问题是 libcairo 安装到cairo.h
而/usr/local/include/cairo/
不是/usr/local/include/
(即更深的一个目录)
您必须使用开关将此目录传递给编译器-I
。
g++ -I/usr/local/include/cairo/ -o screenshot screenshot.cpp
然后你可能会遇到链接器错误——链接器不知道搜索 libcairo 并出现未解析符号的错误。所以让我们g++
再提供几个参数。
g++ -I/usr/local/include/cairo/ -L/usr/local/lib -o screenshot screenshot.cpp -lcairo
-lcairo
告诉链接器搜索一个调用的库cairo
并-L/usr/local/lib
为链接器提供一个额外的目录来搜索。
注意参数顺序很重要with -l
— 它应当放在源文件或目标文件之后。[1](在本例中,在 之后screenshot.cpp
)
这对于编译你的二进制文件来说应该足够了。
pkg-config
是一个自动化这些事情的工具。它为你提供使用特定库编译程序所需的命令行参数。我认为它经常会超出范围并最终链接到多个实际上不需要的库。在这方面,手动方式更好。
[1] 或者说我是这么认为的。老实说,我不明白 GCC 手册页到底在说什么。