要成功编译GnuTLS必须先安装Libgcrypt,而要成功编译Libgcrypt又必须依赖Libgpg-error。所以必须按照Libgpg-error->Libgcrypt->GnuTLS的顺序进行安装。具体安装方法见各程序的INSTALL文档,以下是在安装过程中出现的问题以及解决方法。
对Libgcrypt进行make时会出现以下错误: mpih-add1-asm.S:47:suffix or operands invalid for `push' mpih-add1-asm.S:48:suffix or operands invalid for `push' mpih-add1-asm.S:78:suffix or operands invalid for `jmp' mpih-add1-asm.S:113:suffix or operands invalid for `pop' mpih-add1-asm.S:114:suffix or operands invalid for `pop'这个错误可通过在configure时增加可选项disable-asm来避免。
./configure --disable-asm 对GnuTLS进行make时会出现以下错误: serv.c:515:41: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c: In function 'peer_print_info': serv.c:515: error: '__darwin_obsz' undeclared (first use in this function) serv.c:515: error: (Each undeclared identifier is reported only once serv.c:515: error: for each function it appears in.) serv.c:515: error: expected expression before ')' token serv.c:515: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:517:37: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:517: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:518:31: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:518: error: expected expression before ')' token serv.c:518: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:521:71: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:519: error: expected expression before ')' token serv.c:519: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:533:51: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:533: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:545:49: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:544: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:553:49: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:552: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:562:43: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:560: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:570:43: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:568: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:581:8: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:579: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:590:78: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:590: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:596:70: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:596: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:601:68: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:601: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:606:63: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:606: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:611:60: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:611: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:619:8: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:618: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:623:54: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:623: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast serv.c:627:84: error: macro "__darwin_obsz" passed 2 arguments, but takes just 1 serv.c:627: warning: passing argument 3 of '__builtin___snprintf_chk' makes integer from pointer without a cast这个错误是由于宏snprintf在Mac OS X 10.6下的不兼容造成的。解决方法是修改serv.c中的代码,将宏tmp2拆成两个宏。具体修改如下:
1. 先将tmp2的定义拆分为tmp2b和tmp2l。 -#define tmp2 &http_buffer[strlen(http_buffer)], len-strlen(http_buffer) +#define tmp2b &http_buffer[strlen(http_buffer)] +#define tmp2l len-strlen(http_buffer) 2. 接着将所有调用tmp2的地方替换为tmp2b, tmp2l。参考文章:GnuTLS does not build on OS X 10.6 due to incompatibility with snprintf macro