3

我正在尝试使用 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,以便正确处理内联函数定义?

4

2 回答 2

1

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

编译(和链接)时使用 -O2 重试。

于 2013-03-04T17:43:01.857 回答
0

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

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

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

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

于 2013-03-05T09:13:23.140 回答