使用mingw-w64交叉编译gmp:内联和多个定义

时间:2013-02-20 08:51:46

标签: mingw gmp libtool mingw-w64 gnutls

我正在尝试使用gnutls支持交叉编译VLC(从linux到windows),而gnutls支持又使用libgmp。我在libgmp(___ gmpz_abs)中为符号的多个定义链接错误,例如,在无数其他符号中。由于 gnutls 中的目标文件各自都有 gmp 函数的定义,因此我将其追溯到libgnutls.a,它具有相同符号的多个定义。多重定义的函数是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's或gmp的

我需要回答的问题是:我需要配置什么标志或选项来制作gnutls,以便正确处理内联函数定义?

2 个答案:

答案 0 :(得分:1)

这些函数应该是内联的,但是您似乎已经构建了禁用优化的库,因此没有内联。

编译(和链接)时再次尝试使用-O2。

答案 1 :(得分:0)

我不能给你一个肯定的答案,但也许这对你有所帮助 从GCC手册......

  

请注意,函数定义中的某些用法可能使其不适合内联替换。这些用法包​​括:可变函数,alloca的使用,可变长度数据类型的使用(请参阅可变长度),使用计算goto(请参阅标签作为值),使用非本地goto和嵌套函数(请参阅嵌套函数)。当标记为内联的函数无法替换时,使用 -Winline 会发出警告,并说明失败的原因。

无论如何,值得阅读关于内联函数的部分

http://gcc.gnu.org/onlinedocs/gcc/Inline.html