Symbol Lookup Error After Linking MKL with GCC

Symbol Lookup Error After Linking MKL with GCC

I am attempting to compile and link the following program with gcc.



9 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

The following is my intended post, but this website flagged it as spam incorrectly.

I am attempting to compile and link the following program with gcc that uses the function LAPACKE_dgelsd.

Assuming the aforementioned program is called dgelsd_example.c, I am able to successfully compile and link using icc with the following line. 

icc dgelsd_example.c -mkl

However, I am having difficulty compiling and linking the program with gcc. When I use the MKL Link Line Advisor, I come up with the following line.

  gcc -DMKL_ILP64 -fopenmp -m64 -I$MKLROOT/include dgelsd_example.c  -L$MKLROOT/lib/intel64 -lmkl_intel_ilp64 -lmkl_core -lmkl_sequential -lpthread -lm

But I receive the following error when I execute the executable.

symbol lookup error: /home/yongjae/intel/composer_xe_2013_sp1.1.106/mkl/lib/intel64/ undefined symbol: mkl_vsl_serv_threader_for

All of the environment variables have been correctly set. I am aware there are similar questions, but I did not find a definitive answer. How do I compile and link the program with gcc? 

Hi Yang Jae K. 

From the link link, there is -lmkl_intel_ilp64 ( ,  but in the executable, your mentioned, Could you please check if it is typo error or other problem? 

On the other hand, could you run the dgelsd example ( examples/lapacke/source/ lapacke_dgelsd_row.c) under mkl example directory? 

source /opt/intel/composer_xe_2013_sp1.1.106/mkl/bin/ intel64

gcc -DMKL_ILP64 -fopenmp -m64 -I$MKLROOT/include lapacke_dgelsd_row.c  -L$MKLROOT/lib/intel64 -lmkl_intel_ilp64 -lmkl_core -lmkl_sequential -lpthread -lm


LAPACKE_dgelsd (row-major, high-level) Example Program Results

 Minimum norm solution
  -0.69  -0.24   0.06
  -0.80  -0.08   0.21
   0.38   0.12  -0.65
   0.29  -0.24   0.42
   0.29   0.35  -0.30

 Effective rank =      4

Best Regards,




I followed your suggestions and still receive errors. 

source intel/composer_xe_2013_sp1.1.106/mkl/bin/ intel64

gcc -DMKL_ILP64 -fopenmp -m64 -I$MKLROOT/include dgelsd_example.c  -L$MKLROOT/lib/intel64 -lmkl_intel_ilp64 -lmkl_core -lmkl_sequential -lpthread -lm


However, I receive the following error. 

./a.out: symbol lookup error: /home/yongjae/intel/composer_xe_2013_sp1.1.106/mkl/lib/intel64/ undefined symbol: mkl_vsl_serv_threader_for

I am running Ubuntu 12.04.3 and gcc 4.6.3. Please, advise. 


By the way, dgelsd_example.c is equivalent to lapacke_dgelsd_row.c. Please, advise. 

Hi Yong Jae K. 

could it  be some problem with the GCC on Ubuntu, Do you have other machine to try? 

I just try Ubuntu 13.04 and gcc version 4.7.3, the code run fine too. (in first reply, i try Redhat)  So the problem seems no related to OS. 

But as you know, from

 ldd ./mklMatrixMul: =>  (0x00007fffde182000) => /opt/intel/composer_xe_2013_sp1.0.080/mkl/lib/intel64/ (0x00007fb5908e2000) => /lib/x86_64-linux-gnu/ (0x00007fb590507000) => /lib/x86_64-linux-gnu/ (0x00007fb590303000)
    /lib64/ (0x00007fb591007000)

But with the "fine" exectuable,  it should be link 3 libraries.  The symbols mkl_vsl_serv  is defined in 

 ldd a.out =>  (0x00007fffb2c81000) => /opt/intel/composer_xe_2013_sp1.1.106/mkl/lib/intel64/ (0x00007fbf7709c000) => /opt/intel/composer_xe_2013_sp1.1.106/mkl/lib/intel64/ (0x00007fbf759dd000) => /opt/intel/composer_xe_2013_sp1.1.106/mkl/lib/intel64/
(0x00007fbf7531a000) => /lib64/ (0x00000038e1200000) => /lib64/ (0x00000038e0600000) => /usr/lib64/ (0x00000038e5a00000) => /lib64/ (0x00000038e0a00000) => /lib64/ (0x00000038e0e00000)
        /lib64/ (0x00000038e0200000) => /lib64/ (0x00000038e1a00000)

I'm not sure,  but you may try the command 

gcc -DMKL_ILP64 -fopenmp -m64 -I$MKLROOT/include dgelsd_example.c  -L$MKLROOT/lib/intel64 -Wl, --start-group  -lmkl_intel_ilp64 -lmkl_core -lmkl_sequential -Wl,--end-group  -lpthread -lm

or use static link 

 -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_ilp64.a $(MKLROOT)/lib/intel64/libmkl_core.a $(MKLROOT)/lib/intel64/libmkl_sequential.a -Wl,--end-group -lpthread -lm

Best Regards,

I executed the aforementioned commands with gcc-4.8, and I still receive the same error. What is going on? 

Hello Yong Jae K. 

We discussed the issue with our developing experts.  Based on the fact of the binary refers to only MKL interface library ( which have symbols used in your code, but ignore the core and sequential libraries. We guess some GCC version deployed --as-needed as default behaviors.  ( This option tells linker do not add DT_NEEDED ELF flag for all specified libraries but only for libraries with symbols used in the code, thus dependency/correlated library are not loaded at runtime and executable faile with runtime error). 

So the solution is to change the behaviors, for example, add link option -Wl, --no-as-needed. It guarantee all specified libraries will be written as required at runtime.

The link line like 

gcc -DMKL_ILP64 -fopenmp -m64 -I$MKLROOT/include dgelsd_example.c  -L$MKLROOT/lib/intel64 -Wl, --no-as-needed  -lmkl_intel_ilp64 -lmkl_core -lmkl_sequential  -lpthread -lm

Could you please try it and let us know if it works?

Best Regards,

Yes, that worked. Thank you. I appreciate your help. 


Leave a Comment

Please sign in to add a comment. Not a member? Join today