根据cairo启动exe时缺少cygXau-6.dll错误

时间:2017-04-04 21:19:52

标签: c gcc cygwin mingw cairo

我在cygwin上使用gcc编译了以下代码:

#include <cairo.h>

int
main (int argc, char *argv[])
{
        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;
}

代码来自官方的cairo主页,所以我认为它应该运行。

使用此命令进行编译:

i686-w64-mingw32-gcc kairo.c -o kairo.exe -I /usr/include/cairo/ -L /usr/lib -lcairo

它编译没有问题,但尝试打开.exe(定期在Windows文件浏览器中)会抛出此错误:

“程序无法启动,因为您的PC上缺少cygXau-6.dll。重新安装程序,以解决问题。”

(大致翻译自德语)

但是这个dll似乎是特定于cygwin的,我不希望我的.exe依赖于cygwin。

我是C的新手(来自webdev背景),链接的整个概念对我来说很陌生,但据我所知,我可能需要在可执行文件附近包含DLL,并且可能链接到它带-I标志。

我甚至不知道在构建跨平台C时这是否是正确的方法,但我的第一个目标是简单地让这个代码段在windows下运行。

在使用“常规”gcc进行编译并在cygwin中将其作为kairo.o运行时,它确实有效 - 它会产生所需的结果,一个带有“Hello,World”的png。

我编译某种混合的理论似乎证实了自己 - 我已经用dependencywalker检查了exe并获得了以下输出。

Error: At least one required implicit or forwarded dependency was not found.
Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module.
Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

所以我想我需要找到哪里可以获取cairo的mingw-binaries和头文件并链接到那些。我根本不知道从哪里得到它们。

根据apt-cyg mingw-i686-cairo安装 - 我链接到头文件中的文件并编译它,但现在执行.exe给了我另一个错误: 无法启动应用程序(0x000007b)。

以下命令用于编译:

i686-w64-mingw32-gcc kairo.c -o kairo.exe -I /usr/i686-w64-mingw32/sys-root/mingw/include/cairo/ -L /usr/i686-w64-mingw32/sys-root/mingw/bin/ -lcairo

所以我做了一些更多的研究,似乎我可能仍然在为32位和64位编译的文件之间有一些混淆。可能与dll有关

0 个答案:

没有答案