<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic How to compile a library use a subroutine from another library in Intel® Fortran Compiler</title>
    <link>https://community.intel.com/t5/Intel-Fortran-Compiler/How-to-compile-a-library-use-a-subroutine-from-another-library/m-p/747609#M5085</link>
    <description>Hi&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;I have 3 f90 files. lib1.f90 and lib2.f90 are in directory /path1. main.f90 is in /path1/path2. Details of these files are list below.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The contents of lib1.f90:&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;   subroutine sub1 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub1&lt;/DIV&gt;&lt;DIV&gt;   subroutine sub2 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub2&lt;/DIV&gt;&lt;DIV&gt;   subroutine sub3 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub3&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The contents of lib2.f90:&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;   module mod1&lt;/DIV&gt;&lt;DIV&gt;   integer :: i&lt;/DIV&gt;&lt;DIV&gt;   ...&lt;/DIV&gt;&lt;DIV&gt;   contains&lt;/DIV&gt;&lt;DIV&gt;   subroutine sub4 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub4&lt;/DIV&gt;&lt;DIV&gt;   subroutine sub5 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   call sub1()&lt;/DIV&gt;&lt;DIV&gt;   call sub2()&lt;/DIV&gt;&lt;DIV&gt;   call sub3()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub5&lt;/DIV&gt;&lt;DIV&gt;   endmodule mod1&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The contents of main.f90:&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;PROGRAM&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;use mod1&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;call sub4()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;call sub5()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;end&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;I want to compile lib1.f90 as lib1.a and lib2.f90 as lib2.a.&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ifort -c lib1.f90 -o lib1.o&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ar rcv lib1.a lib1.o&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ifort -c lib2.f90 -o lib2.o&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ar rcv lib2.a lib2.o&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;so there will be mod1.mod in /path1&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;and then create main.x&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;$ifort -I../mod1.mod -L../lib1.a -L../lib2.a main.f90&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;main.f90(1): error #7002: Error in opening the compiled module file. Check INCLUDE paths.  [MOD1]&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;use mod1&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;----^&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;compilation aborted for main.f90 (code 1)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;why I include the mod name and path but compiler can't find it?&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;Then I change it like this:&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;$ ifort -I../ -L../lib1.a -L../lib2.a main.f90&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;/tmp/ifortKAQrlg.o: In function `MAIN__':&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;main.f90:(.text+0x33): undefined reference to `mod1_mp_sub4_'&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;main.f90:(.text+0x38): undefined reference to `mod1_mp_sub5_'&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;It seem mod could be found. But sub4 and sub5 in lib2.a haven't been defined. Some advice?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;If I just compile 3 files together:&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ifort ../lib1.f90 ../lib2.f90 main.f90&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;everything goes well.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Thanks a lot.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;</description>
    <pubDate>Mon, 28 Jun 2010 19:35:27 GMT</pubDate>
    <dc:creator>brickflying</dc:creator>
    <dc:date>2010-06-28T19:35:27Z</dc:date>
    <item>
      <title>How to compile a library use a subroutine from another library</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/How-to-compile-a-library-use-a-subroutine-from-another-library/m-p/747609#M5085</link>
      <description>Hi&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;I have 3 f90 files. lib1.f90 and lib2.f90 are in directory /path1. main.f90 is in /path1/path2. Details of these files are list below.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The contents of lib1.f90:&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;   subroutine sub1 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub1&lt;/DIV&gt;&lt;DIV&gt;   subroutine sub2 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub2&lt;/DIV&gt;&lt;DIV&gt;   subroutine sub3 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub3&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The contents of lib2.f90:&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;   module mod1&lt;/DIV&gt;&lt;DIV&gt;   integer :: i&lt;/DIV&gt;&lt;DIV&gt;   ...&lt;/DIV&gt;&lt;DIV&gt;   contains&lt;/DIV&gt;&lt;DIV&gt;   subroutine sub4 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub4&lt;/DIV&gt;&lt;DIV&gt;   subroutine sub5 ()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   call sub1()&lt;/DIV&gt;&lt;DIV&gt;   call sub2()&lt;/DIV&gt;&lt;DIV&gt;   call sub3()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;...&lt;/DIV&gt;&lt;DIV&gt;   endsubroutine sub5&lt;/DIV&gt;&lt;DIV&gt;   endmodule mod1&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;The contents of main.f90:&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;PROGRAM&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;use mod1&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;call sub4()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;call sub5()&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;end&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;I want to compile lib1.f90 as lib1.a and lib2.f90 as lib2.a.&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ifort -c lib1.f90 -o lib1.o&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ar rcv lib1.a lib1.o&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ifort -c lib2.f90 -o lib2.o&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ar rcv lib2.a lib2.o&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;so there will be mod1.mod in /path1&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;and then create main.x&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;$ifort -I../mod1.mod -L../lib1.a -L../lib2.a main.f90&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;main.f90(1): error #7002: Error in opening the compiled module file. Check INCLUDE paths.  [MOD1]&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;use mod1&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;----^&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;compilation aborted for main.f90 (code 1)&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;why I include the mod name and path but compiler can't find it?&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;Then I change it like this:&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;$ ifort -I../ -L../lib1.a -L../lib2.a main.f90&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;/tmp/ifortKAQrlg.o: In function `MAIN__':&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;main.f90:(.text+0x33): undefined reference to `mod1_mp_sub4_'&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;main.f90:(.text+0x38): undefined reference to `mod1_mp_sub5_'&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;It seem mod could be found. But sub4 and sub5 in lib2.a haven't been defined. Some advice?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;If I just compile 3 files together:&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN style="white-space: pre;"&gt;	&lt;/SPAN&gt;ifort ../lib1.f90 ../lib2.f90 main.f90&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;everything goes well.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;Thanks a lot.&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Mon, 28 Jun 2010 19:35:27 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/How-to-compile-a-library-use-a-subroutine-from-another-library/m-p/747609#M5085</guid>
      <dc:creator>brickflying</dc:creator>
      <dc:date>2010-06-28T19:35:27Z</dc:date>
    </item>
    <item>
      <title>How to compile a library use a subroutine from another library</title>
      <link>https://community.intel.com/t5/Intel-Fortran-Compiler/How-to-compile-a-library-use-a-subroutine-from-another-library/m-p/747610#M5086</link>
      <description>&lt;P&gt;First, &lt;STRONG&gt;-I&lt;/STRONG&gt; accepts only a path argument so that's why the case specifying the path and module file name (mod1.mod) did not work. You only need to specify the path to the module file(s) not the actual name(s).&lt;/P&gt;&lt;P&gt;Similarly, &lt;STRONG&gt;-L&lt;/STRONG&gt; only specifies the path to libraries. You should also use the &lt;STRONG&gt;l&lt;/STRONG&gt; (lowercase) to specify the actual library names without the leading "lib" and trailing ".a".&lt;/P&gt;&lt;P&gt;Next, the undefined references relate to the order the linker sees the lib (.a) and object file for main.f90.&lt;/P&gt;&lt;P&gt;You can successfully compile/link your sample program using the commands below. I changed your lib names to libONE.a and libTWO.a to help show use of the &lt;STRONG&gt;l&lt;/STRONG&gt; option.&lt;/P&gt;&lt;P&gt;cd /path1&lt;/P&gt;&lt;P&gt; ifort -V -c lib1.f90 -o lib1.o&lt;BR /&gt; ar rcv libONE.a lib1.o&lt;/P&gt;&lt;P&gt; ifort -V -c lib2.f90 -o lib2.o&lt;BR /&gt; ar rcv libTWO.a lib2.o&lt;/P&gt;&lt;P&gt;cd path2&lt;BR /&gt; ifort -V -I.. main.f90 -L.. -lTWO -lONE&lt;/P&gt;&lt;P&gt;It is important to note the compilation of main.f90 and subsequent link for the ifort command line above only succeed because of the order the files appear on the command line given their inner dependencies.&lt;/P&gt;&lt;P&gt;You can avoid this ordering requirement using the linker's &lt;STRONG&gt;--start-group&lt;/STRONG&gt;/&lt;STRONG&gt;--end-group &lt;/STRONG&gt;to repeatedly search archives until all external references are resolved. Normally an archive is searched only once and in the order specified on the command-line. Notice that libONE and libTWO have switched positions below.That's just an attempt to show the link succeeds related to the linker repeatedly searching those two archives to resolve externals.&lt;/P&gt;&lt;P&gt;The alternative to the ifort command for main.f90 above is to compile main.f90 to an object file and then link all components as shown:&lt;/P&gt;&lt;P&gt;ifort -V -I.. -c main.f90&lt;BR /&gt;ifort -V -L.. main.o -Wl,--start-group,-lONE,-lTWO -Wl,--end-group&lt;/P&gt;&lt;P&gt;Hope that helps.&lt;/P&gt;</description>
      <pubDate>Tue, 29 Jun 2010 09:19:11 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-Fortran-Compiler/How-to-compile-a-library-use-a-subroutine-from-another-library/m-p/747610#M5086</guid>
      <dc:creator>Kevin_D_Intel</dc:creator>
      <dc:date>2010-06-29T09:19:11Z</dc:date>
    </item>
  </channel>
</rss>

