我在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有关