我正在使用英特尔 MKL 库和 GCC 编译器构建相同的应用程序,并使用英特尔建议的所有标志。要使用 GCC OMP 实现,建议使用 -fopenmp,它将程序与 -lgomp 链接。这在 Ubuntu 12.04 上运行良好,但在 Ubuntu 13.10 上 GCC 似乎无法找到正确的符号。任何人都知道我是否做错了什么?
g++ -I$MKLROOT/include -I/home/jjgarcia/mps-bundle-gcc/include -g -O2 -fopenmp -o xy_stuck.exe xy_stuck.cc -O2 -L$MKLROOT/lib -L/home/jjgarcia/ mps-bundle-gcc/lib -lmps -ltensor -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -ldl -lpthread -lf2c
顺便说一句,明确添加 -lgomp 并没有帮助。
这些是错误
/opt/intel/composer_xe_2013.3.163/mkl/lib/intel64/libmkl_gnu_thread.so: undefined reference to `GOMP_critical_end'
/opt/intel/composer_xe_2013.3.163/mkl/lib/intel64/libmkl_gnu_thread.so: undefined reference to `omp_get_thread_num'
/opt/intel/composer_xe_2013.3.163/mkl/lib/intel64/libmkl_gnu_thread.so: undefined reference to `GOMP_sections_end_nowait'
...
使用 -v -v 获取详细输出显示 GCC 调用的链接器。我手动添加了 -lgomp 并且它没有改变。另请注意,链接器不会抱怨找不到 gomp :-?
/usr/bin/ld --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o xy_stuck.exe /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/opt/intel/composer_xe_2013.3.163/mkl/lib -L/home/jjgarcia/mps-bundle-gcc/lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/opt/intel/composer_xe_2013.3.163/compiler/lib/intel64 -L/opt/intel/composer_xe_2013.3.163/mkl/lib/intel64 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. -v /tmp/ccm64m9T.o -lmps -ltensor -lmkl_intel_lp64 -lmkl_core -lmkl_gnu_thread -ldl -lpthread -lf2c -lgomp -lstdc++ -lm -lgomp -lgcc_s -lgcc -lpthread -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o