我正在尝试使用 gnutls 支持交叉编译 VLC(从 linux 到 windows),而 gnutls 支持又使用 libgmp。我得到了 libgmp (___gmpz_abs) 中符号的多个定义的链接错误,例如,在无数其他符号中。我又将其追溯到 libgnutls.a 具有相同符号的多个定义,因为gnutls中的目标文件每个都有自己的gmp函数定义。多重定义的函数是 libgmp 试图通过内联做一些棘手的事情的函数。
据我所知,不同编译器、标准和平台之间的内联存在很多差异。似乎 libgmp 正在尝试使用宏来正确处理这一切,但失败了。最终结果是 gmp.h 中定义的内联函数被复制到使用它的 gnutls 中的每个目标文件中。我查看了调用 mingw 以创建这些目标文件的实际编译器命令行,我看不出它有什么问题:
libtool: compile: i686-w64-mingw32-gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I../.. -I./../../gl -I./../../gl -I./../includes -I./../includes -I./../../gl -I./.. -I./../minitasn1 -I/home/jeremy/vlc/contrib/i686-w64-mingw32/include -I/home/jeremy/vlc/contrib/i686-w64-mingw32/include -g -c mpi.c -o mpi.o
特别是 -std=gnu99 被建议作为在线其他地方类似问题的解决方案,但显然这已经默认使用。
不清楚这是谁的错,mingw 的 libtool 的 gnutls 的还是 gmp 的
我需要回答的问题是:我需要使用哪些标志或选项来配置或制作 gnutls,以便正确处理内联函数定义?