使用 ifort 和 icc 编译和 link Fortran 和 C
Compile and link Fortran and C with ifort and icc
我正在从 gcc 切换到 Intel ifort 和 icc。
Fortran 代码大部分是遗留的,系统的其余部分也是如此。
主程序是用 C 语言编写的。它处理 I/O 并将所有内容传递给 Fortran 子例程。
现在我用以下代码编译 Fortran 部分:
cd fortran
ifort -I../inc -debug full -c *.[fF]
cd ..
对于 C 和链接我试过:
icc -ansi -static -debug full -Wall -o testout \
-I./inc -L./lib\
main.c \
fortran/*.o \
-lifcore -limf -lm\
这给了我:
ld: cannot find -lm
ld: cannot find -lm
ld: cannot find -lc
ld: cannot find -ldl
ld: cannot find -lc
这主要是从以前的 bash 脚本复制而来,用 gcc 编译。
-static
标志将 link 所有 静态库。在那种情况下,您需要每个库的静态版本(.a
文件)。例如,使用 -lm
将搜索 libm.a
。默认情况下不安装这些库,但可能在您的发行版的 -dev
或 -devel
包中。
如果您只想 link 静态地使用英特尔库,那么您应该使用 -static-intel
.
避免静态 linking 的一个好方法是:
1) 动态 link 您的程序 -static-intel
和 -Wl,-rpath=./lib
2) 使用 ldd
查找您的程序需要哪些库
3) 创建一个目录lib
,在其中复制所有需要的动态库
4) 您可以将代码分发为二进制文件 + lib 目录(假设库的许可证允许),而不是将代码分发为单个静态二进制文件。
最后,如果你需要尝试更多的东西,我已经成功地 link 使用 gcc 的英特尔 Fortran 文件使用这个命令:
$ gcc fortran_file.o c_main_file.o -lifcore -lirc -lcomposerxe_gen_helpers_core_2.3
希望这对您有所帮助...
我正在从 gcc 切换到 Intel ifort 和 icc。
Fortran 代码大部分是遗留的,系统的其余部分也是如此。
主程序是用 C 语言编写的。它处理 I/O 并将所有内容传递给 Fortran 子例程。
现在我用以下代码编译 Fortran 部分:
cd fortran
ifort -I../inc -debug full -c *.[fF]
cd ..
对于 C 和链接我试过:
icc -ansi -static -debug full -Wall -o testout \
-I./inc -L./lib\
main.c \
fortran/*.o \
-lifcore -limf -lm\
这给了我:
ld: cannot find -lm
ld: cannot find -lm
ld: cannot find -lc
ld: cannot find -ldl
ld: cannot find -lc
这主要是从以前的 bash 脚本复制而来,用 gcc 编译。
-static
标志将 link 所有 静态库。在那种情况下,您需要每个库的静态版本(.a
文件)。例如,使用 -lm
将搜索 libm.a
。默认情况下不安装这些库,但可能在您的发行版的 -dev
或 -devel
包中。
如果您只想 link 静态地使用英特尔库,那么您应该使用 -static-intel
.
避免静态 linking 的一个好方法是:
1) 动态 link 您的程序 -static-intel
和 -Wl,-rpath=./lib
2) 使用 ldd
查找您的程序需要哪些库
3) 创建一个目录lib
,在其中复制所有需要的动态库
4) 您可以将代码分发为二进制文件 + lib 目录(假设库的许可证允许),而不是将代码分发为单个静态二进制文件。
最后,如果你需要尝试更多的东西,我已经成功地 link 使用 gcc 的英特尔 Fortran 文件使用这个命令:
$ gcc fortran_file.o c_main_file.o -lifcore -lirc -lcomposerxe_gen_helpers_core_2.3
希望这对您有所帮助...