使用gcc编译时,我无法链接/编译第三方库Cairo。

3
出现的错误是未定义的符号,不是我从示例中复制的Cairo函数,而是我猜测是内部函数。我已经查看了周围,并尝试使用终端中一个常见的在线示例中verbatim的$(pkg-config --cflags --libs cairo)。
在使用EXPORT=(我的cairos .ps文件路径)之后,我尝试了这个。
在链接器设置中,我目前在CodeBlocks中有一个选项“链接库”:/usr/lib/x86-linux-gnu/libcairo.a 此外,我还在编译器选项中添加了/usr/include/cairo

Errors:

/usr/lib/x86_64-linux-gnu/libcairo.a(cairo-image-source.o)||In function _cairo_image_source_finish':| (.text+0x1c)||undefined reference topixman_image_unref'|

Plus 50 more like it.

Which are generated from the following, main.c:

include cairo.h (with # and <>)

int main()
{

    cairo_surface_t *surface =
        cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 240, 80);
    cairo_t *cr =
        cairo_create (surface);

    cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    cairo_set_font_size (cr, 32.0);
    cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
    cairo_move_to (cr, 10.0, 50.0);
    cairo_show_text (cr, "Hello, world");

    cairo_destroy (cr);
    cairo_surface_write_to_png (surface, "hello.png");
    cairo_surface_destroy (surface);

    return 0;
}

Any help fixing and understanding what's going on would be greatly appreciated. Thanks.


1
它正在寻找函数pixman_image_unref。显然cairo依赖于pixman http://www.pixman.org/,因此您还需要链接该库。 - Charlie Burns
看起来 pixman 没有安装。你是怎么安装 cairo 的? - Nick Beeuwsaert
5个回答

3
因此,解决这个问题的方法如下:
使用pkg-config获取所有正确的包含文件。通过在编译器设置的“其他选项”选项卡中添加以下内容来自动执行此操作:pkg-config --cflags --libs cairo(用“ ` ”括起来,位于波浪线键上)。
我也在链接器“其他选项”选项卡中执行了相同的操作,使用以下内容:pkg-config --libs cairo(同样用“ ` ”括起来,重音符号)。
现在我可以无错误地构建和编译,但是当我运行它时,我看不到任何东西,只有一个空的控制台窗口 : /。

1
由于您正在使用PNG表面,因此您还需要在pkconfig行中包含“cairo-png”。尝试: $(pkg-config --cflags --libs cairo cairo-png)
有关cairo相关的所有pkg-config选项的完整列表,请查看/usr/lib/pkgconfig。
祝您好运。
Alwin

抱歉,我没有完全读懂您的编译器输出。请在pkgconfig目录下查找一个pixman.pc文件(或类似文件;在我的系统中是pixman-1.pc)。检查此文件以获取所需的库选项(在我的系统中,它会添加到/usr/lib路径,并包含pixman-1库)。将其添加到您的Code::Blocks链接库中。 - Alwin Leerling
我已经给链接器提供了几个新的 .a 文件,当然,会出现新的未定义引用错误。我尝试在命令行中使用 $(pkg-config --cflags --clibs cairo),但没有成功。如何让链接器始终使用 pkg-config? - Chris

1
这明显意味着链接器无法定位所有必需的链接引用。具体来说,你的cairo库函数依赖于不同库中的pixman_image_unref,而链接器无法定位此库。你需要包含pixman库或任何其他包含pixman_image_unref的库。

0

我曾经遇到过同样的问题,但是我没有使用pkg-config,而是直接链接到了/usr/lib下的libcairo.so库文件来解决它。

g++ -L/usr/lib -lcairo hello.o -o hello

我最初尝试使用Eclipse Luna,但没有成功,所以我使用自定义的makefile从终端运行它:

CC=g++
CFLAGS=-c -Wall -I/usr/include/cairo
LDFLAGS=-L/usr/lib -lcairo
SOURCES=hello.c
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=hello

all: $(SOURCES) $(EXECUTABLE)

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.c.o:
    $(CC) $(CFLAGS) $< -o $@

希望能对你有所帮助。

祝好!


0

只需使用-lpixman-1。 当您在-L/_path_to_lib/后面添加-lpixman-1时,即可完成。

-L/_path_to_lib/ -lpixman-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接