使用 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

我正在尝试使用 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 };

但我得到 运行 时间错误 'undefined referece' 到 __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"

我尝试找到所有 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

消除了我因链接顺序而遇到的其他错误。