我正在Ubuntu-16.04中构建一个c程序。如下面的另一个答案here,我设置了cflag enviornment变量,我正在运行gcc命令,如下所示
export CFLAGS="-msse4.1"
gcc -o dpdkif_user.o -O2 -g -Wno-format-zero-length -Wno-pointer-sign -Werror -I/home/nikhil/projects/drv-netif-dpdk/rumptools/dest/usr/include -U_FORTIFY_SOURCE -DVIRTIF_BASE=dpdk -I/home/nikhil/projects/drv-netif-dpdk/src/libdpdkif/virtif -I/home/nikhil/projects/dpdk/build/include -c dpdkif_user.c
Gcc版
cc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
但是,我仍然看到以下错误:
/usr/lib/gcc/x86_64-linux-gnu/5/include/tmmintrin.h:185:1: error: inlining failed in call to always_inline ‘_mm_alignr_epi8’: target specific option mismatch
_mm_alignr_epi8(__m128i __X, __m128i __Y, const int __N)
^
In file included from /home/nikhil/projects/dpdk/build/include/rte_ether.h:50:0,
from dpdkif_user.c:47:
/home/nikhil/projects/dpdk/build/include/rte_memcpy.h:641:13: error: called from here
_mm_storeu_si128((__m128i *)((uint8_t *)dst + 1 * 16), _mm_alignr_epi8(xmm2, xmm1, offset)); \
^
/home/nikhil/projects/dpdk/build/include/rte_memcpy.h:681:16: note: in expansion of macro ‘MOVEUNALIGNED_LEFT47_IMM’
case 0x0F: MOVEUNALIGNED_LEFT47_IMM(dst, src, n, 0x0F); break; \
^
/home/nikhil/projects/dpdk/build/include/rte_memcpy.h:821:2: note: in expansion of macro ‘MOVEUNALIGNED_LEFT47’
我错过了什么?非常感谢任何帮助。
答案 0 :(得分:3)
内联失败原因目标特定选项不匹配意味着内联失败,因为程序从另一个不支持此目标的函数调用具有特定目标属性的always-inline函数。这实际上是不可支持的:编译器不能编译函数来使用某些微架构功能(always-inline函数)而不使用它们(内联函数)。
在这种特殊情况下,原因似乎是DPDK源使用编译器内在函数,但是您没有使用必要的子目标选项进行编译。您可能已设置CFLAGS
变量,但它似乎对编译没有任何影响(它不是您引用的命令行的一部分)。此外,tmmintrin.h
需要-mssse3
,而不是-msse4.1
。 DPDK makefile应该处理所有这些细节。