- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Can anyone help please???? I am trying to produce 32bit fortran binaries on a 64 bit ubuntu but problems seem to occur whenever I link to the mkl libraries . I used to use 64bit CENTOS for the same purpose and never had problems when linking with the following flags -convert big_endian -L/usr/lib -lblas -llapack . On ubuntu 6.10 I get the following errors :
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: cannot find -lm
I have also tried -convert big_endian -L/opt/intel/mkl/10.1.1.019/lib -lmkl_blas -lmkl_lapack which I believe is the correct way as this would automatically link to the intel mkl libs but the error is very similar:
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: cannot find -lm
I have tried many different ways, different compiler versions but to no avail.. Can anyone please please help??
Thank you
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: cannot find -lm
I have also tried -convert big_endian -L/opt/intel/mkl/10.1.1.019/lib -lmkl_blas -lmkl_lapack which I believe is the correct way as this would automatically link to the intel mkl libs but the error is very similar:
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: cannot find -lm
I have tried many different ways, different compiler versions but to no avail.. Can anyone please please help??
Thank you
Link Copied
9 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The error suggests the linker search found /usr/lib/libm.so, which is the 32-bit version, but something else being linked in (presumably MKL) has been linked against and wants the 64-bit version of libm. Your -L path to MKL is not specific to the 32-bit versions so that may be the issue.
What happens when using a 32-bit specific path to MKL of: -L/opt/intel/mkl/10.1.1.019/lib/32
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Quoting - Kevin Davis (Intel)
The error suggests the linker search found /usr/lib/libm.so, which is the 32-bit version, but something else being linked in (presumably MKL) has been linked against and wants the 64-bit version of libm. Your -L path to MKL is not specific to the 32-bit versions so that may be the issue.
What happens when using a 32-bit specific path to MKL of: -L/opt/intel/mkl/10.1.1.019/lib/32
Hello Kevin and thank you for your quick reply. Unfortunately the 32 bit specific path -L/opt/intel/mkl/10.1.1.019/lib/32 gives the same error:
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: cannot find -lm
I am using build 21( 10.1.1.021) ifort compiler but build 19 (10.1.1.019) libs. Could that be a problem? Thanks
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I don't expect the ifort/MKL versions used is the issue. We need to determine what is calling for the 64-bit version of libm.
If you are driving the link via ifort, can you add -# and then capture the output into a reply. If you are driving the link from ld, can you provide the complete link line.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Quoting - Kevin Davis (Intel)
I don't expect the ifort/MKL versions used is the issue. We need to determine what is calling for the 64-bit version of libm.
If you are driving the link via ifort, can you add -# and then capture the output into a reply. If you are driving the link from ld, can you provide the complete link line.
ifort: command line warning #10156: ignoring option '-s'; no argument required
also if this is any help, I also seem to produce wrong binaries in 64 bit as well! If I use compiler (fce) for 64bit with flags -convert big_endian -L/opt/intel/mkl/10.1.1.019/lib/64 -lmkl_blas -lmkl_lapack the error is:
ld: skipping incompatible /opt/intel/mkl/10.1.1.019/lib/64/libmkl_lapack.so when searching for -lmkl_lapack
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a(_DftiCreateDescriptorDM1_fortran_lp64.o): warning: sh_link not set for section `.IA_64.unwind'
ld: skipping incompatible /opt/intel/mkl/10.1.1.019/lib/64/libmkl_intel_lp64.a when searching for libmkl_intel_lp64.a
ld: cannot find libmkl_intel_lp64.a
While using fce with -L/usr/lib64 -lblas -llapack seems to compile and link ok and produce an executable but unfortunately this gives the incorrect result.. Thanks
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
In order to build 32-bit mode on x86_64, you must have installed full support for g++ -m32. You must set the -m32 option for gnu compilers, and also set the 32-bit paths for all Intel compilers and libraries (fce or ia32 versions of ifort). Your errors indicate that your library paths and your compiler don't agree on 32- vs 64-bit choice.
As 64-bit Ubuntu uses a scheme for placement of 32- and 64-bit gnu libraries which is different from all other distros, except (hopefully) Debian, there could be problems in that aspect of setup. g++ -m32 -print-search-dirs would show the paths where those libraries must be installed; it would have to be a 32-bit g++ which is built specifically for the peculiar Ubuntu directory setup.
As 64-bit Ubuntu uses a scheme for placement of 32- and 64-bit gnu libraries which is different from all other distros, except (hopefully) Debian, there could be problems in that aspect of setup. g++ -m32 -print-search-dirs would show the paths where those libraries must be installed; it would have to be a 32-bit g++ which is built specifically for the peculiar Ubuntu directory setup.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Tim is right. You have a mix of mismatched components at play and may not have the appropriate g++ 32-bit environment installed. If you did not install the 32-bit version of ifort either, then you may need to do that too.
First, fce implies you are using the ifort Intel 64 compiler that will *not* produce 32-bit code. To produce a 32-bit executable you must use the 32-bit ifort that resides under the fc sub-directory. That requires you source the appropriate ifortvars.sh (or ifortvars.csh) under a path similar to: /opt/intel/fc/10.1.021
Next, the path -L/opt/intel/mkl/10.1.1.019/lib/64 is for the Itanium processor (also 64-bit but not for use on Intel 64 and what you want). While they are not of interest to you, the MKL libraries under the em64t specific MKL sub-directory are for use on Intel 64 when producing a 64-bit capable executable to run on x86_64.
If you are trying to produce a 32-bit executable then you need to:
1.Ensure you installed the appropriate g++ Tim mentions (use: g++ -m32 -print-search-dirs)
2. Compile using the 32-bit ifort (if you source the 32-bit ifortvars.sh/ifortvars.csh you will be fine). You can verify which ifort is used with the command: which ifort
3. Link with the 32-bit MKL libraries using the 32 specific MKL path I mentioned earlier
Just FYI. What I was asking for was to add -# to the ifort command, something like:
ifort -# -o hello_exe hello.f90
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Quoting - Kevin Davis (Intel)
Tim is right. You have a mix of mismatched components at play and may not have the appropriate g++ 32-bit environment installed. If you did not install the 32-bit version of ifort either, then you may need to do that too.
First, fce implies you are using the ifort Intel 64 compiler that will *not* produce 32-bit code. To produce a 32-bit executable you must use the 32-bit ifort that resides under the fc sub-directory. That requires you source the appropriate ifortvars.sh (or ifortvars.csh) under a path similar to: /opt/intel/fc/10.1.021
Next, the path -L/opt/intel/mkl/10.1.1.019/lib/64 is for the Itanium processor (also 64-bit but not for use on Intel 64 and what you want). While they are not of interest to you, the MKL libraries under the em64t specific MKL sub-directory are for use on Intel 64 when producing a 64-bit capable executable to run on x86_64.
If you are trying to produce a 32-bit executable then you need to:
1.Ensure you installed the appropriate g++ Tim mentions (use: g++ -m32 -print-search-dirs)
2. Compile using the 32-bit ifort (if you source the 32-bit ifortvars.sh/ifortvars.csh you will be fine). You can verify which ifort is used with the command: which ifort
3. Link with the 32-bit MKL libraries using the 32 specific MKL path I mentioned earlier
Just FYI. What I was asking for was to add -# to the ifort command, something like:
ifort -# -o hello_exe hello.f90
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Demian, this is the root-cause of the errors you suffered.
Ubuntu (64-bit) uses this directory structure for 32-bit/64-bit libs, where /usr/lib contains 64-bit libraries:
drwxr-xr-x 42 root root 12288 2008-04-04 05:46 /usr/lib
drwxr-xr-x 5 root root 4096 2007-11-22 01:49 /usr/lib32
lrwxrwxrwx 1 root root 3 2007-06-26 03:07 /usr/lib64 -> lib
drwxr-xr-x 10 root root 4096 2007-06-26 03:07 /usr/local
Something like RedHat EL5 (64-bit) uses this, where /usr/lib contains 32-bit libraries:
$ ls -ld /usr/l*
drwxr-xr-x 88 root root 65536 May 9 2008 /usr/lib
drwxr-xr-x 112 root root 94208 Oct 26 04:04 /usr/lib64
drwxr-xr-x 15 root root 4096 Oct 26 04:04 /usr/libexec
drwxr-xr-x 13 root root 4096 Oct 22 15:41 /usr/local
Using the 32-bit compiler on any 64-bit Linux pulls libraries from /usr/lib. So the issue is clear. /usr/lib on Ubuntu contains 64-bit libraries, hence the ld errors shown below:
$ ifort -V hello.f90
Intel Fortran Compiler for applications running on IA-32, Version 10.1 Build 20090203 Package ID: l_fc_p_10.1.022
Copyright (C) 1985-2009 Intel Corporation. All rights reserved.
Intel Fortran 10.1-2052
GNU ld version 2.17.50 20070103 Ubuntu
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: skipping incompatible /usr/bin/../lib/libm.so when searching for -lm
ld: skipping incompatible /usr/bin/../lib/libm.a when searching for -lm
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: cannot find -lm
ifort does not support a -m32 like option so there is no straightforward method of convincing the 32-bit compiler to use complete 32-bit libraries under this Ubuntu (64-bit) directory structure. I do not know if we will succeed, but we have a couple of other items to try. I will keep you updated.
Ubuntu (64-bit) uses this directory structure for 32-bit/64-bit libs, where /usr/lib contains 64-bit libraries:
drwxr-xr-x 42 root root 12288 2008-04-04 05:46 /usr/lib
drwxr-xr-x 5 root root 4096 2007-11-22 01:49 /usr/lib32
lrwxrwxrwx 1 root root 3 2007-06-26 03:07 /usr/lib64 -> lib
drwxr-xr-x 10 root root 4096 2007-06-26 03:07 /usr/local
Something like RedHat EL5 (64-bit) uses this, where /usr/lib contains 32-bit libraries:
$ ls -ld /usr/l*
drwxr-xr-x 88 root root 65536 May 9 2008 /usr/lib
drwxr-xr-x 112 root root 94208 Oct 26 04:04 /usr/lib64
drwxr-xr-x 15 root root 4096 Oct 26 04:04 /usr/libexec
drwxr-xr-x 13 root root 4096 Oct 22 15:41 /usr/local
Using the 32-bit compiler on any 64-bit Linux pulls libraries from /usr/lib. So the issue is clear. /usr/lib on Ubuntu contains 64-bit libraries, hence the ld errors shown below:
$ ifort -V hello.f90
Intel Fortran Compiler for applications running on IA-32, Version 10.1 Build 20090203 Package ID: l_fc_p_10.1.022
Copyright (C) 1985-2009 Intel Corporation. All rights reserved.
Intel Fortran 10.1-2052
GNU ld version 2.17.50 20070103 Ubuntu
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: skipping incompatible /usr/bin/../lib/libm.so when searching for -lm
ld: skipping incompatible /usr/bin/../lib/libm.a when searching for -lm
ld: skipping incompatible /usr/lib/libm.so when searching for -lm
ld: skipping incompatible /usr/lib/libm.a when searching for -lm
ld: cannot find -lm
ifort does not support a -m32 like option so there is no straightforward method of convincing the 32-bit compiler to use complete 32-bit libraries under this Ubuntu (64-bit) directory structure. I do not know if we will succeed, but we have a couple of other items to try. I will keep you updated.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The library layout on 64bit Debian-like distributions is different from other distributions :
The path of the C library initialization routines is hard-coded in ifortbin, but there is a simple workaround : the path of the linker is not hard-coded, one can add a wrapper to the linker which adapts the names to the Debian layout.
Just add the following script to ifort's directory, should be /opt/intel/fc//bin, call it 'ld', make it executable, and it should work (the ifort script puts it's directory at the front of the PATH)
- other distributions have added 64bit support to their 32bit version
- initially, Debian took the same route, but noticing that 64bit executables were generally faster than their 32bit versions, started over (~2004), adding 32bit support to a 64bit distribution
That's why on Debian, /lib64 is simply a symbolic link to /lib, which contains 64bit stuff.
The path of the C library initialization routines is hard-coded in ifortbin, but there is a simple workaround : the path of the linker is not hard-coded, one can add a wrapper to the linker which adapts the names to the Debian layout.
Just add the following script to ifort's directory, should be /opt/intel/fc/
[shell]#!/bin/bash # ld wrapper for ifort to compile in 32bits mode on 64bits Debian-like dists # Benoit Speckel - 2009 - Public domain lib32=/emul/ia32-linux/usr/lib args=(-L $lib32) i=2 for o do [[ "$o" == /usr/lib/*crt?.o ]] && { f=$lib32/${o##*/} [ -e $f ] && o=$f } args[$((i++))]=$o done exec /usr/bin/ld "${args[@]}" [/shell]Tested on a 64bit Debian-Lenny with ifort 10.1, hope it helps.

Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page