【发布时间】: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
标签: gcc linker sse simd intrinsics