- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have a code that we have been compiling for years on LInux and Windows. Just got a Mac and I am trying to compile it using IFC 11.1.084. I am getting an error that we do not understand.
ifort -02 -auto -ansi_alias- -pad_source -warn -traceback -fltconsistency -fpconstant
-nogen-interfaces relap/relap5.o \\
relap/relapo.a scdap/scdap.a contmn/contmn.a \\
matpro/matpro.a scdap/scdap.a envrl/envrl.a \\
-Vaxlib -o relap5o.x
ipo: warning #11015 Warning unknown option -no_compact_unwind
Undefined symbols:
"_zrech2_mp_wh2s", referenced from:
_recomb_ in contemo.a(recomb.o)
_recomb_ in contemo.a(recomb.o)
_recomb_ in contemo.a(vaenph.o)
_recomb_ in contemo.a(vaenps.o)
And the list goes on and on. Not sure what to do. Am i missing an option for compiling on a mac?
1 Solution
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
OK, the key is to simplify the ar and ranlib lines, PARTICULARLY ranlib:
ar r blah blah blah
ranlib -c blah blah blah
^ there's the key. This is different than on Linux:
-c Include common symbols as definitions with respect to the table of contents. This is seldom the intended
behavior for linking from a library, as it forces the linking of a library member just because it uses an
uninitialized global that is undefined at that point in the linking. This option is included only because
this was the original behavior of ranlib. This option is not the default.
Linux ar does this automatically, Mac OS ar/ranlib does not. Common symbols are all of your module data - no wonder there were so many undefined symbols.
I found 1 or 2 of your 'ar' commands in your make* files that did not have a ranlib following them still. Check for those.
your options to ifort could be cleaned up, but it's probably not critical. You have some really ancient compiler options, and some I've never seen ( -ansi_auto for example ). I would recommend these:
-O2 -auto -no-ansi-alias -pad-source -traceback -fpmodel precise -fpconstant
and any -warn options you may want.
ron
ar r blah blah blah
ranlib -c blah blah blah
^ there's the key. This is different than on Linux:
-c Include common symbols as definitions with respect to the table of contents. This is seldom the intended
behavior for linking from a library, as it forces the linking of a library member just because it uses an
uninitialized global that is undefined at that point in the linking. This option is included only because
this was the original behavior of ranlib. This option is not the default.
Linux ar does this automatically, Mac OS ar/ranlib does not. Common symbols are all of your module data - no wonder there were so many undefined symbols.
I found 1 or 2 of your 'ar' commands in your make* files that did not have a ranlib following them still. Check for those.
your options to ifort could be cleaned up, but it's probably not critical. You have some really ancient compiler options, and some I've never seen ( -ansi_auto for example ). I would recommend these:
-O2 -auto -no-ansi-alias -pad-source -traceback -fpmodel precise -fpconstant
and any -warn
ron
Link Copied
18 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Maybe start by dropping some obsolete or undocumented options to see if they cause a problem.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Are youreferringto the -no_compact_unwind option? We are not using that option and we are not using ipo option (interprocedural optimization). All the options in the ifort command are usable on the mac IFC.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The ipo probably comes as a result of the link script checking by default for any IPO files, so that isn't directly the fault of any options, except as a result of undefined reference.
Vaxlib is a very old option, pad_source isn't documented, fltconsistency isn't documented in the latest compiler (not Mac) which I have.
fltconsistency resembled the current option '-fp-model source'.
ansi-alias is a C option, it should be the default (but isn't documented) for ifort.
Vaxlib is a very old option, pad_source isn't documented, fltconsistency isn't documented in the latest compiler (not Mac) which I have.
fltconsistency resembled the current option '-fp-model source'.
ansi-alias is a C option, it should be the default (but isn't documented) for ifort.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
you did not say how you built the .a libraries. Make sure to use -O2 and NOT use -fast or -ipo. You did rebuild these on the Mac and are not trying to use libraries built on Linux or Windows, right?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
On Mac OS X you need to run 'ranlib' on the libraries after you create them. This is unique to Mac OS X. after the ar, add a rule to 'ranlib mylib.a' where you replace mylib.a with your library name.
the -no_compact_unwind is a warning only, and was introduced by the Mac OS X linker ld which changed in 10.6.2. This ld option is being sent to our ifort driver which CURRENTLY doesn't recognize this option. There is a fix in the works for this. The bug number on this is DPD200089706 and you should see it in the next compiler update.
For now, work around it with compiler option -Wl,-no_compact_unwind -wd,11015
which will surpress the warning message.
ron
the -no_compact_unwind is a warning only, and was introduced by the Mac OS X linker ld which changed in 10.6.2. This ld option is being sent to our ifort driver which CURRENTLY doesn't recognize this option. There is a fix in the works for this. The bug number on this is DPD200089706 and you should see it in the next compiler update.
For now, work around it with compiler option -Wl,-no_compact_unwind -wd,11015
which will surpress the warning message.
ron
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I added the ranlib line as specified. Still having same problems.
Here is how the make file looks.
ar -rsv envrl/envrl$(NM).a $?
ranlib envrl/envrl$(NM).a
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
OK, let's look at one missing symbol:
decoding this: there is a module named 'zrech2'. inside this module is a symbol, either a subroutine or function or data variable named 'wh2s'. "_mp_" is a generic inserted part of the name for "module procedure". What is odd, by default ifort should be adding a trailing underscore - I would have expected a symbol named _zrech2_mp_wh2s_ UNLESS you have compiled with -assume nounderscore or you have a !DEC$ ALIAS directive to change the way the name is exported. BUT inside procedure recomb, there are calls or uses of it that are referencing the name WITHOUT underscore. Why?
So, 2 things to check:
1) How is the symbol created for wh2s: find where wh2s is declared inside module zrech2. That module is part of a source file. You compile/make to create a .o object file, let's call it 'target.o' just for an example. Use command 'nm' to look for that symbol in target .o:
nm target.o | grep -i wh2s
Now, does wh2s have the Target "T " attribute AND does it have a trailing underscore, like _zrech2_mp_wh2s_
2) find file recomb.o. Use nm to confirm that the reference to _zrech2_mp_wh2s is in there. It should have the "U " attribute, meaning it's a remote/external reference.
Now, figure out how recomb.o is built/made. Is there any options used like -assume nounderscore or -nus?
IF you can't find module zrech2 somewhere in your source tree then you are missing source files or a library. Otherwise, figure out why the reference inside recomb.o/contemo.a is removing the underscore.
ron
Undefined symbols:
"_zrech2_mp_wh2s",decoding this: there is a module named 'zrech2'. inside this module is a symbol, either a subroutine or function or data variable named 'wh2s'. "_mp_" is a generic inserted part of the name for "module procedure". What is odd, by default ifort should be adding a trailing underscore - I would have expected a symbol named _zrech2_mp_wh2s_ UNLESS you have compiled with -assume nounderscore or you have a !DEC$ ALIAS directive to change the way the name is exported. BUT inside procedure recomb, there are calls or uses of it that are referencing the name WITHOUT underscore. Why?
So, 2 things to check:
1) How is the symbol created for wh2s: find where wh2s is declared inside module zrech2. That module is part of a source file. You compile/make to create a .o object file, let's call it 'target.o' just for an example. Use command 'nm' to look for that symbol in target .o:
nm target.o | grep -i wh2s
Now, does wh2s have the Target "T " attribute AND does it have a trailing underscore, like _zrech2_mp_wh2s_
2) find file recomb.o. Use nm to confirm that the reference to _zrech2_mp_wh2s is in there. It should have the "U " attribute, meaning it's a remote/external reference.
"_zrech2_mp_wh2s", referenced from:
_recomb_ in contemo.a(recomb.o)
Now, figure out how recomb.o is built/made. Is there any options used like -assume nounderscore or -nus?
IF you can't find module zrech2 somewhere in your source tree then you are missing source files or a library. Otherwise, figure out why the reference inside recomb.o/contemo.a is removing the underscore.
ron
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I preformed the command: nm zrech2.obj | grep -i wh2s
and got:
0000000000000010 C _zrech2_mp_wh2s_
I did the same thing for the recomb.obj file and got
U _zrech2_mp_ipzs_
U _zrech2_mp_itrh_
U _zrech2_mp_ndrh_
U _zrech2_mp_qrh2_
U _zrech2_mp_ttrh_
U _zrech2_mp_wgae_
U _zrech2_mp_wgas_
U _zrech2_mp_wh2e_
U _zrech2_mp_wh2s_
U _zrech2_mp_wn2e_
U _zrech2_mp_wn2s_
U _zrech2_mp_wo2e_
U _zrech2_mp_wo2s_
U _zrech2_mp_wvpe_
U _zrech2_mp_wvps_
-assume is not used anywhere
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
The nm output for zrech2.obj shows wh2s and "C" or Common symbol, typically for uninitialized data. Is it safe to assume that wh2s is module data - can you show the declaration of wh2s in module zrech2?
We have seen some issues with "C" data in the past. What version of Mac OS X are you using? And what version of the linker, ld?
$ ld -v
@(#)PROGRAM:ld PROJECT:ld64-95.2.12
Finally, ld is supplied as part of the Xcode tools. What version is your Xcode?
I'm a bit baffled as to why your initial post showed missing symbol "_zrech2_mp_wh2s" without the underscore. I see that the object containing the variable AND the calling routines are referring to the underscored version (correctly so).
ron
We have seen some issues with "C" data in the past. What version of Mac OS X are you using? And what version of the linker, ld?
$ ld -v
@(#)PROGRAM:ld PROJECT:ld64-95.2.12
Finally, ld is supplied as part of the Xcode tools. What version is your Xcode?
I'm a bit baffled as to why your initial post showed missing symbol "_zrech2_mp_wh2s" without the underscore. I see that the object containing the variable AND the calling routines are referring to the underscored version (correctly so).
ron
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am running Mac OS X 10.6.2 and XCode 3.2.1
ld version:
@(#)PROGRAM:ld PROJECT:ld64-95.2.12
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am running Mac OS X 10.6.2 and XCode 3.2.1
ld version:@(#)PROGRAM:ld PROJECT:ld64-95.2.12
One other thing is, I told the make file to manually load all object decks. When I did that, theexecutablewas createdsuccessfully. There is a problem with loading the libraries.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I removed several of the options and I still had the same problem.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Brian,
At this point I cannot help any further without the code. Would it be possible to 'make clean' and tar up the entire application, makefile(s), and input files? You can attach to this forum using this technique:
http://software.intel.com/en-us/articles/how-to-attach-file-insert-code-into-forum-post/
and I can make this thread private so only you and I can see it (let me know to do this and confirm that it's private if this is how you want to work).
ron
At this point I cannot help any further without the code. Would it be possible to 'make clean' and tar up the entire application, makefile(s), and input files? You can attach to this forum using this technique:
http://software.intel.com/en-us/articles/how-to-attach-file-insert-code-into-forum-post/
and I can make this thread private so only you and I can see it (let me know to do this and confirm that it's private if this is how you want to work).
ron
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Have you had a chance to look at the attachment yet?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
yes, I am working on it today.
I've simplified the compile options and ar and ranlib options but still no luck. It is odd, I can see the missing symbols inside the .a libraries! ar, ld, ranlib, to me, operate oddly on Mac OS. As you say, we'd be done on linux.
I will keep investigating.
ron
I've simplified the compile options and ar and ranlib options but still no luck. It is odd, I can see the missing symbols inside the .a libraries! ar, ld, ranlib, to me, operate oddly on Mac OS. As you say, we'd be done on linux.
I will keep investigating.
ron
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
OK, the key is to simplify the ar and ranlib lines, PARTICULARLY ranlib:
ar r blah blah blah
ranlib -c blah blah blah
^ there's the key. This is different than on Linux:
-c Include common symbols as definitions with respect to the table of contents. This is seldom the intended
behavior for linking from a library, as it forces the linking of a library member just because it uses an
uninitialized global that is undefined at that point in the linking. This option is included only because
this was the original behavior of ranlib. This option is not the default.
Linux ar does this automatically, Mac OS ar/ranlib does not. Common symbols are all of your module data - no wonder there were so many undefined symbols.
I found 1 or 2 of your 'ar' commands in your make* files that did not have a ranlib following them still. Check for those.
your options to ifort could be cleaned up, but it's probably not critical. You have some really ancient compiler options, and some I've never seen ( -ansi_auto for example ). I would recommend these:
-O2 -auto -no-ansi-alias -pad-source -traceback -fpmodel precise -fpconstant
and any -warn options you may want.
ron
ar r blah blah blah
ranlib -c blah blah blah
^ there's the key. This is different than on Linux:
-c Include common symbols as definitions with respect to the table of contents. This is seldom the intended
behavior for linking from a library, as it forces the linking of a library member just because it uses an
uninitialized global that is undefined at that point in the linking. This option is included only because
this was the original behavior of ranlib. This option is not the default.
Linux ar does this automatically, Mac OS ar/ranlib does not. Common symbols are all of your module data - no wonder there were so many undefined symbols.
I found 1 or 2 of your 'ar' commands in your make* files that did not have a ranlib following them still. Check for those.
your options to ifort could be cleaned up, but it's probably not critical. You have some really ancient compiler options, and some I've never seen ( -ansi_auto for example ). I would recommend these:
-O2 -auto -no-ansi-alias -pad-source -traceback -fpmodel precise -fpconstant
and any -warn
ron
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you sooooo much for the help. What you suggested worked.

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