使用 gcc 而不是 icpc 编译时未定义的引用运行时错误 __intel_ssse3_rep_memcpy、_mm_free、_mm_malloc 链接器错误

Posted

技术标签:

【中文标题】使用 gcc 而不是 icpc 编译时未定义的引用运行时错误 __intel_ssse3_rep_memcpy、_mm_free、_mm_malloc 链接器错误【英文标题】:undefined reference runtime errors __intel_ssse3_rep_memcpy, _mm_free,_mm_malloc linker errors when compiling with gcc instead of icpc 【发布时间】:2017-04-28 16:51:28 【问题描述】:

我正在尝试使用 gcc(5.3) 编译大型代码,该代码之前使用 icpc 编译过。(我已加载 mkl 库)编译成功但出现以下警告:

 warning: narrowing conversion of 'p_jShell->simint_shell::nprim' from 'int' to
'unsigned int' inside   [-Wnarrowing]
   p_iShell->nprim, p_jShell->nprim ;

但我收到运行时错误“未定义的引用”到 __intel_ssse3_rep_memcpy、_mm_free、_mm_malloc、__svml_pow4、_intel_fast_memset 等。

In function `simgms_oei(std::vector<std::vector<simint_shell, std::allocator<simint_shell> >, std::allocator<std::vector<simint_shell, std::allocator<simint_shell> > > >&, std::vector<double, std::allocator<double> >&, std::vector<double, std::allocator<double> >&, std::vector<std::vector<unsigned int, std::allocator<unsigned int> >, std::allocator<std::vector<unsigned int, std::allocator<unsigned int> > > >&, unsigned int, AtomData&)':

/home/..../simgms_oei.cpp:126: undefined reference to `oed__memory_ovl_batch_'
..
..

In function `simint_copy_shell':
shell.c:(.text+0x126): undefined reference to `__intel_ssse3_rep_memcpy'
.
shell.c:(.text+0x32fe): undefined reference to `_mm_free'
shell.c:(.text+0x335c): undefined reference to `_mm_malloc'
.
ostei_p_s_f_p.c:(.text+0x27f): undefined reference to `_intel_fast_memset'
.
..
..

我怀疑这可能是由于链接问题。我链接了 gcc lib 目录,但我不确定我需要在这里拥有哪些库。有什么建议么?有人看到我在这里做错了吗?谢谢!

gcc  -mavx -g -O -O1 -std=c++11 -L/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/lib64 -libstdc -libsupc++ -libtsan -libubsan -libvtv -libquadmath -libgcc_s -libgcj  -L/opt/intel/composer_xe_2013.5.192/mkl/lib/intel64 -libmkl_mc -libmkl_sequential -libmkl_gf_ilp64 -libmkl_avx -libmkl_lapack95_lp64 -libmkl_intel_lp64 -libmkl_core -lmkl_gnu_thread -I/opt/intel/composer_xe_2013.5.192/mkl/include  -I/opt/shared/sw/x86_64-unknown-linux-gnu/gcc/5.3.0-rhel6/include -I/***/simint/include  -DDEBUG -DMKL_ILP64 -MMD -MP -MF"simgms_init.d" -MT"simgms_init.d" -c -o "simgms_init.o" "../simgms_init.cpp"

【问题讨论】:

我的猜测是,您正在链接目标文件和/或已编译 icpc 的库,因此需要链接到该编译器的运行时库。 我用 gcc 编译了所有东西,但是我发现有些头文件是从 intel 编译器中使用的。即使它们具有相同的名称,例如:来自 intel 的 immintrin.h 与 gcc 中的 immintrin.h 不同,但我已经修复了这些错误。 在 gcc 的内在头文件中(在本例中为 mm_malloc.h,但它也包含在其他文件中),_mm_malloc 是一个内联函数。如果你得到这样一个未定义的符号,要么你没有使用 gcc,要么你使用了 gcc 和其他一些编译器的头文件,或者你忽略了关于 _mm_malloc 缺少原型(也就是缺少#include)的错误。 另外,您显示的命令行毫无意义,带有-c-l... 标志。并且在链接时,当 A 依赖于 B 时,您应该在 B 之前写 A,因此特别是您的 .cpp 文件应该位于所有 -l... 标志之前。 我应该把这个作为评论。你试过这个吗? software.intel.com/en-us/articles/intel-mkl-link-line-advisor 【参考方案1】:

我尝试找到所有 cpp 文件(simgms_oei.cpp 等)的库都被编译到并尝试了下面的 nm 命令:

>> nm libsimint.a |grep __intel_ssse3_rep_memcpy
U __intel_ssse3_rep_memcpy

>> nm libsimint.a |grep simint_copy_shell
0000000000000090 T simint_copy_shell

当您查找 U 和 T 时,它的含义如下: 代码中提到了 simint_copy_shell 函数,但 __intel_ssse3_rep_memcpy 未在我们编译 libsimint 的其他库中定义

结论是这个库是用icpc编译的,在上面的步骤中链接之前,我不得不用gcc单独重新编译它。

将 Wl, 命令添加到链接描述文件中,如下所示:

--Wl,--start-group -L/opt/share... -lsomelib -lsomeotherlib -L/xxx/...-lsomelib  -Wl,--end-group

摆脱了由于链接顺序引起的其他错误。

【讨论】:

以上是关于使用 gcc 而不是 icpc 编译时未定义的引用运行时错误 __intel_ssse3_rep_memcpy、_mm_free、_mm_malloc 链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

exit.c:(.text+0x18): 使用 arm-none-eabi-gcc 时未定义对 `_exit' 的引用

调用内联函数时未定义的引用

链接时未定义引用符号'socket@GLIBC_2.4'

奇怪的错误 - 链接到自己的库gcc时未定义的引用

急!LINUX下,GCC编译,原程序包含<semaphore.h>头文件,为啥编译时说sem_wait,sem_post等未定义的引用

使用 gcc 编译器时未在此范围内声明“memcpy”