FORTRAN静态库动态库的生成
动态库和静态库的制作过程
动态库和静态库的制作过程我们通常把一些公用函数制作成函数库,供其它程序使用。
函数库分为静态库和动态库两种。
静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。
在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。
第1步:编辑得到举例的程序--hello.h、hello.c和main.c;hello.c(见程序2)是函数库的源程序,其中包含公用函数hello,该函数将在屏幕上输出"Hello XXX!"。
hello.h(见程序1)为该函数库的头文件。
main.c(见程序3)为测试库文件的主程序,在主程序中调用了公用函数hello。
#ifndef HELLO_H#define HELLO_Hvoid hello(const char *name);#endif //HELLO_H程序1: hello.h#include <stdio.h>void hello(const char *name){printf("Hello %s!\n", name);}程序2: hello.c#include "hello.h"int main(){hello("everyone");return 0;}程序3: main.c第2步:将hello.c编译成.o文件;无论静态库,还是动态库,都是由.o文件创建的。
因此,我们必须将源程序hello.c通过gcc先编译成.o文件。
在系统提示符下键入以下命令得到hello.o文件。
# gcc -c hello.c#(注1:本文不介绍各命令使用和其参数功能,若希望详细了解它们,请参考其他文档。
Fortran生成dll(原创)
Fortran生成dll
周浩(武汉大学测绘学院2012102140004)1、新建Fortran动态链接库工程(File-New-Projects-Fortran Dynamic Link Library),本文Project
name命名为SumDll
2、点击OK,选择第二项
3、点击Finish,可以看到f90文件中自动生成了如下的代码:
4、在其中添加运算代码,也可以修改函数参数。
特别需要注意的是,不要改动“!DEC$ ATTRIBUTES DLLEXPORT::SumDll”,该语句用来说明函数SumDll可以被其它程序调用。
每个要被外界调用的dll函数,都需要使用这个命令。
没有这个命令,则函数只能够在dll 文件中使用。
因此,由于我们的项目是分开编写的,为了避免各个dll文件中出现函数重名等现象,建议在各自生成的dll文件中,只对接口函数加入该语句。
subroutineSumDll(a,b,c)
! Expose subroutine SumDll to users of this DLL
!
!DEC$ ATTRIBUTES DLLEXPORT::SumDll
! Variables
integer*4::a,b,c
! Body of SumDll
c=a+b
end subroutine SumDll
5、对工程进行“编译Compile”,“链接Build”,最后“执行Execute”。
会有如下对话框出现。
直接Cancel
6、在Debug目录下将生成:SumDll.dll和SumDll.lib。
gfortran动态库生成方式
gfortran动态库生成方式
在Linux系统下,使用gfortran编译和生成动态库(Shared Library)的方式如下:1. 编写Fortran源代码文件(例如test.f90),并确保该文件中的模块、子程序或函数正确地声明和使用了`bind(c)`以便进行C语言接口的调用。
2. 打开终端,并使用以下命令来编译Fortran源代码文件并生成动态库:gfortran -shared -o libtest.so test.f90上述命令中的`-shared`选项表示生成动态库,`-o`选项用于指定输出文件名。
在本例中,生成的动态库文件名为`libtest.so`。
3. 编译过程中,如果在链接阶段出现关于缺失某些依赖库的错误,可以通过添加`-L`选项和`-l`选项来显式地指定这些库的位置和名称,例如:gfortran
-shared -o libtest.so test.f90 -L/path/to/lib -ldependency其中`-L`选项指定了依赖库的路径`/path/to/lib`,`-l`选项指定了依赖库的名称`dependency`。
4. 编译成功后,生成的动态库文件就可以在其他程序中使用了。
可以通过将动态库文件复制到系统目录下(例如`/usr/lib`)或将其所在的路径添加到
`LD_LIBRARY_PATH`环境变量来使其他程序能够找到并加载该动态库。
请注意,以上命令中的示例仅供参考,具体命令可能需要根据实际情况进行调整。
C#与Fortran混合编程-本地调用Fortran动态链接库
C#与Fortran混合编程-本地调用Fortran动态链接库Fortran是一门古老的语言,它是世界上最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。
FORTRAN语言以其特有的功能在数值、科学和工程计算领域发挥着重要作用。
然而Fortran程序本身不适合开发独立的应用程序,例如我们传统的桌面应用或者Web应用。
因此这里我们便想将C#与Fortran 结合,C#借助Fortran可以实现精度更高,计算更快的程序,而Fortran通过C#,便也能够达到可视化设计。
一、基本思路运用Fortran,编写动态链接库(DLL),在DLL中提供计算的函数接口,然后在C#中调用该DLL中计算部分的函数,实现计算过程。
这里需要注意的是,由于我们使用的是Fortran编译器,生成的DLL属于第三方非托管DLL,因此无法直接在程序中添加DLL的引用。
具体的做法将在后续部分说明。
二、编写Fortran程序,生成动态链接库文件知道思路之后便开始正式的Coding。
首先新建一个空的Fortran Dynamic-link Library项目。
在Intel(R) Visual Fortran点击Library,选中右图的Dynamic-link Library.然后点击OK.这时的项目如下所示:点击Sources File文件夹,选择新建项。
添加一个新的Fortran文件然后便开始Fortran代码的编写工作。
这里我们主要实现两个方法:一个方法是求两个数相加之和,并返回结果。
另一个是输入一个数组,对这个数组进行排序,并找出最大值,最后返回排序后的结果,并返回最大值。
这里我们分别演示的是Fortran传出一个数和一个数组有何不同。
关于Fortran的基本语法不是本文的讨论范畴,请读者自行查阅资料。
下面给出的上述我们要实现的功能的具体Fortran代码:DOUBLE PRECISION FUNCTION ADD(A,B)!DEC$ ATTRIBUTES DLLEXPORT::ADD!DEC$ ATTRIBUTES STDCALL,ALIAS:'Add'::ADDDOUBLE PRECISION:: A,BADD=A+BENDFUNCTION SORTANDFINDMAX(ARRAY,LENGTH)!DEC$ ATTRIBUTES DLLEXPORT::SORTANDFINDMAX!DEC$ ATTRIBUTES STDCALL,ALIAS:'Sortandfindmax'::SORTANDFINDMAX DOUBLE PRECISION ::ARRAY(LENGTH)INTEGER::I,JDOUBLE PRECISION::SORTANDFINDMAX,TEMPSORTANDFINDMAX=ARRAY(1)DO I=1,LENGTH-1DO J=I+1,LENGTHIF(ARRAY(I).GT.ARRAY(J)) THENTEMP=ARRAY(I)ARRAY(I)=ARRAY(J)ARRAY(J)=TEMPSORTANDFINDMAX=ARRAY(J)END IFEND DOEND DOEND上面我们声明了两个Fortran函数,一个是计算两个数相加,一个是选择排序并找出最大值。
利用FORTRAN建立动态链接库的步骤如下
利用FORTRAN建立动态链接库的步骤如下
利用FORTRAN建立动态链接库的步骤如下:
1,在fortran开发环境下新建一个工程,其类型为Dynamic link libiary,,并且命名工程,编写源程序,命名,插入工程或将一个只含有函数或者子程序的fortran程序加入到project 中,编译通过即可生成DLL。
在此必须对调用的函数或子程序加以声明,以标识这些函数或子程序在所生成的DLL中是可用的。
具体语法如下:
Subroutine sub name
! MS $ ATTRTBUTES DLLEXPORT :: sub name
$ A TTRTBUTES用于声明微软扩展属性。
DLLEXPORT是上述属性之一,它的作用就是声明该函数或子程序能被其他程序或DLL调用,sub name为函数或子程序名。
2,VB调用FORTRAN DLL
用上面的程序建立动态链接库后就可以用VB调用它,在调用前,首先对被调用的DLL 模板在模块级别中进行声明,VB程序声明如下:【Public ︳private】declare sub name lib “libname ”【alias “aliasname”】【(【arglist】)】.
声明之后在VB中使用call 语句实现调用DLL中的函数或子程序。
调用语句如下:Call sub name (arglist)。
静态库的使用与创建
静态库的使用与创建静态库是一种预编译的库,它包含了一组已经编译好的目标文件(.o文件)。
使用静态库可以将一些常用的函数、类或其他代码打包成一个单独的文件,以便在多个应用程序中重复使用。
使用静态库:1. 创建静态库:首先需要将要打包的源代码编译成目标文件,然后使用静态库工具(如ar)将目标文件打包成静态库文件(.a文件)。
2. 链接静态库:在编译应用程序时,需要引用静态库文件,并将其链接到应用程序的可执行文件中。
可以使用编译器的命令行选项来指定链接静态库的路径和名称。
创建静态库的一般步骤如下:1. 编写源代码文件:创建需要打包进静态库的源代码文件(.c、.cpp、.h等)。
2. 编译源代码文件:使用编译器将源代码文件编译成目标文件(.o文件)。
例如,使用gcc编译C文件:`gcc -c file.c -o file.o`。
3. 打包目标文件:使用静态库工具(如ar)将目标文件打包成静态库文件。
例如,使用ar工具创建静态库:`ar rcs libfile.a file1.o file2.o ...`。
4. 链接静态库:在应用程序的编译过程中,使用编译器的命令行选项来链接静态库文件。
例如,使用gcc链接静态库:`gcc main.c -o main -L<path_to_lib> -lfile`。
注意事项:在创建静态库时,需要保持相应源代码文件的可移植性和独立性,以便在不同的项目中使用。
链接静态库时,需要确保目标文件和静态库文件的路径正确,并且编译器能够找到它们。
如果静态库依赖于其他库,需要确保这些依赖库也正确链接到应用程序中。
使用静态库可以提高代码的重用性和管理性,尤其是对于一些通用的函数或模块。
这种方法适用于部署到嵌入式设备、静态链接的可执行文件等场景。
动态库和静态库
xianga…11月23日正文字体大小:大中小静态库与动态库的建立与使用(2011-11-03 13:27:55)转载▼分类:C/C标签:杂谈转《深入浅出Visual C++动态链接库编程》作者宋宝华静态链接库就是你使用的.lib文件,库中得代码最后需要连接到你的可执行文件中去,所以静态连接的可执行文件一般比较大一些。
引用:一、通用:格式如:#pragma comment(lib,"XXX.lib") //指定与静态库一起连接二、针对开发环境:1、如果使用VC,可以在Project Setting-->Link中加入你的静态库,也可以直接把该.lib 文件加入到你的工程中2、如果使用Visual Studio,位置在项目→配置属性→连接器→输入→附加依赖项中加入.lib文件静态链接库不同于动态链接库(*.dll),在静态库情况下,函数和数据被编译进一个二进制文件(通常扩展名为*.LIB),Visual C++的编译器在链接过程中将从静态库中恢复这些函数和数据并把他们和应用程序中的其他模块组合在一起生成可执行文件。
这个过程称为"静态链接",此时因为应用程序所需的全部内容都是从库中复制了出来,所以静态库本身并不需要与可执行文件一起发行。
静态链接库对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。
图1 建立一个静态链接库如图1,在VC++6.0中new一个名称为libTest的static library工程(单击此处下载本工程附件),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下://文件:lib.h#ifndef LIB_H#define LIB_Hextern "C" int add(int x,int y);//声明为C编译、连接方式的外部函数#endif//文件:lib.cpp#include "lib.h"int add(int x,int y){return x + y;}编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。
C静态库(lib)及动态库(dll)的创建及调用
C静态库(lib)及动态库(dll)的创建及调用一、静态库的创建及调用最近在编程序的时候,用到静态库和动态库的创建和调用,将自己的一些心得总结如下,希望对各位有所帮助,有不恰当之处欢迎评论留言。
静态库和动态库的区别可以参考博客:windows中静态库lib和动态dll的区别及使用方法_dxzysk的专栏-CSDN博客_动态dll和静态库的区别1、静态库的创建为了方便大家学习,从空项目进行演示,实现输入两个数求出两数之和及两数之差,本文使用VS2017编译器。
(1)创建空项目(2)新建头文件.h和源文件.cpp其中test工程为后面测试用工程,现在不用考虑。
(3)修改项目属性,将目标文件扩展名和配置类型均修改为.lib (4)在项目头文件testLib.h中编写代码方法一和方法二均可以生成和调用(5)源文件testLib.cpp代码编写(6)工程生成可以看到工程目录下生成了testLib.ib和testLib.pdb文件,代表静态库生成成功。
2、静态库的调用(1)为了方便演示,在静态库生成的同解决方案下创建测试工程test,本地创建的是控制台应用程序。
(2)创建完测试工程后,在test.cpp文件中编写静态库调用程序(3)将test工程设置为启动工程,编译运行,会出现报错(4)针对(3)出现的报错,需要在项目中引入静态库文件路径静态库生成工程和测试工程目录如下:引入静态库的相对路径再次编译就可以成功。
运行结果如下至此,静态库的创建及调用讲解结束。
二、动态库的创建及调用1、动态库的创建动态库的创建介绍两种方式:__declspec(dllexport)和.def文件导出。
1.1、动态库的创建(__declspec(dllexport))(1)同静态库一样创建空项目testDll,创建头文件和源文件(2)修改项目属性,将目标文件扩展名和配置类型均修改为.dll(3)修改项目头文件testDll.h,本文介绍三种dll库生成的方法动态生成库的关键字为__declspec(dllexport)方法一和方法二的区别就是标识符是否被定义,如果标识符TESTDLL被定义则重新定义标识符TESTDLLAPI,并使用重新定义的标识符进行函数导出;如果标识符TESTDLL未被定义,则使用当前定义的标识符进行函数导出。
GCC编译步骤及静态库动态库制作
GCC编译步骤及静态库动态库制作GCC是一种广泛使用的编译器,可以将C、C++等高级语言源代码转换为可执行的机器码。
本文将介绍GCC编译步骤及制作静态库和动态库的过程。
1. 预处理(Preprocessing):预处理器会处理源代码,根据预编译指令进行操作,例如宏展开、条件编译等。
预处理后的代码仍然是源代码,只是进行了一些文本替换和宏展开操作。
3. 汇编(Assembling):汇编器将汇编语言转换为机器码,生成目标文件(Object Files)。
目标文件包含可执行代码的二进制表示,以及与其他目标文件和库文件链接的信息。
4. 链接(Linking):链接器将多个目标文件和库文件结合在一起,生成最终的可执行文件。
链接器会解析目标文件之间的引用和符号,将它们关联起来,并生成可执行文件。
静态库制作:静态库是一种包含可执行代码和函数的库文件,在链接时会将库文件中的代码复制到最终的可执行文件中。
静态库的制作分为以下几个步骤:1.编写库代码:创建一个或多个源文件,其中包含一些可重用的函数和类。
确保将库代码编写成独立的、可移植的模块。
2. 编译库代码:使用GCC进行编译,将源代码文件编译成目标文件。
例如,对于C文件使用以下命令编译为目标文件:`gcc -c file1.cfile2.c`。
3. 归档库文件:将目标文件归档成库文件。
使用GCC进行归档时,可以使用`ar`命令。
例如,使用以下命令将目标文件归档:`ar rcs libmylib.a file1.o file2.o`。
这将创建名为libmylib.a的静态库文件。
4. 使用库文件:在需要使用库函数的程序中,包含库的头文件,并在链接时将库文件链接到程序中。
例如,使用以下命令编译和链接程序:`gcc -o myprog myprog.c -L. -lmylib`。
其中,-L参数指定库文件的路径,-l参数指定要链接的库文件。
在程序中使用库函数时,只需包含相应的头文件,并调用库函数。
一GCC编译的详细参数以及动态库和静态库的制作
一GCC编译的详细参数以及动态库和静态库的制作GCC是一款开源的编程语言编译器,支持多种编程语言,如C、C++、Objective-C等。
它具有丰富的编译参数,可以根据需要进行定制化的编译过程。
在本文中,我们将介绍GCC的详细编译参数以及如何制作动态库和静态库。
GCC的编译参数可以分为通用参数和语言特定参数两类。
通用参数用于控制编译过程的各个方面,而语言特定参数用于针对不同的编程语言进行优化和指定。
一、通用参数1.-o:指定输出文件的名称。
2.-c:生成目标文件,不进行链接。
3.-E:只进行预处理。
4.-D:定义宏,可以通过-D宏=值的方式定义宏。
5.-I:指定头文件的路径。
6.-L:指定库文件的路径。
7.-l:指定需要链接的库文件。
8.-g:生成调试信息。
9.-O:指定优化级别,可以是-O0(无优化)、-O1(基本优化)、-O2(更高级别优化)、-O3(最高级别优化)。
10. -Wall: 启用所有警告。
11. -Werror: 将警告视为错误。
12. -std: 指定所使用的语言标准。
二、语言特定参数1.C语言参数:- -ansi: 使用ANSI C标准。
- -pedantic: 严格遵循ANSI C标准。
- -Wstrict-prototypes: 检查函数原型的严格性。
2.C++语言参数:- -Wnon-virtual-dtor: 警告非虚析构函数。
- -Woverloaded-virtual: 警告多态函数的重载。
3. Objective-C语言参数:- -fobjc-exceptions: 开启异常处理。
- -fobjc-gc: 启用自动垃圾回收。
- -fobjc-arc: 启用自动引用计数。
动态库和静态库是代码重用的一种方式,可以方便地在不同的项目中使用已有的代码。
1.动态库制作:动态库是在运行时被加载的库,可以允许程序在运行过程中动态链接库文件。
1) 编译源码生成目标文件:gcc -c source.c -o source.o。
一GCC编译的详细参数以及动态库和静态库的制作
一GCC编译的详细参数以及动态库和静态库的制作GCC是一个开源的编程语言编译器套件,它支持多种编程语言,包括C、C++、Objective-C、Fortran、Java和Ada。
GCC提供了非常丰富的编译选项,可以根据编译的需要进行配置。
下面是一些常用的GCC编译选项:1.优化选项:--O0:不进行优化。
--O1:进行基本优化,可以提高代码运行速度。
--O2:进行更多的优化,会消耗更多的编译时间。
--O3:进行更深入的优化,可能会改变代码的行为。
2.调试选项:--g:生成调试信息,可以在调试器中使用。
- -ggdb:生成与GDB调试器兼容的调试信息。
- -gdwarf:生成与DWARF调试格式兼容的调试信息。
3.目标选项:- -march:指定生成的目标架构。
- -mtune:指定优化的目标处理器。
- -mlittle-endian:生成小端字节顺序的代码。
4.头文件和库文件选项:- -I <directory>:指定头文件路径。
- -L <directory>:指定库文件路径。
- -l <library>:链接指定的库文件。
动态库和静态库的制作涉及到将一组源代码文件编译成可执行代码的过程。
GCC提供了多个选项来控制动态库和静态库的制作。
静态库是一组目标文件的归档文件,可以通过GCC的ar命令创建。
下面是一些常用的选项:--c:编译源代码文件成为目标文件。
- ar rcs <library_name> <object_files>:将多个目标文件归档成一个静态库。
- -l <library_name>:链接指定的静态库。
动态库是一组在运行时加载的共享目标文件,可以通过GCC的共享链接器选项创建。
下面是一些常用的选项:--fPIC:产生与位置无关的代码。
- -shared:创建共享目标文件。
- -Wl,-soname,<library_name>:指定动态库的名称。
头文件和库文件-静态库和动态库
头⽂件和库⽂件-静态库和动态库⼀、头⽂件和库⽂件头⽂件提供声明,库⽂件提供定义/实现。
C代码的编译过程: 预处理(需要头⽂件) -> 编译 -> 汇编 -> 链接(需要库⽂件); 执⾏时可能还有动态链接过程。
编译的时候,只要有头⽂件中的声明就⾜够了。
在链接的时候,把已经编译好的.obj和现有的.lib⽂件进⾏链接,这时就可以最终⽣成可执⾏⽂件了。
其实头⽂件与其实现⽂件或相应lib⽂件都没有直接的联系。
头⽂件是告诉编译器函数是如何去调⽤如何返回的,所有实现都是分别编译,最后在链接阶段链在⼀起。
头⽂件包含声明, 库⽂件包含实现或者与DLL库的连接所以,如果在代码⾥要⽤到这些函数那么就要包含头⽂件,编译的时候才能知道这些函数的原形;在进⾏代码连接的时候就需要库⽂件了,这时连接器就把函数的实现代码(静态库)连接到你的程序或者将你的函数调⽤连接到相应的DLL的对应函数(动态库)lib是静态库, 编译的时候代码直接插⼊到你的程序 ,DLL是动态库,编译的时候,只是产⽣⼀些调⽤DLL内代码的导⼊表,真正运⾏的时候是调⽤的DLL内的代码。
总结起来就是,库⽂件通过头⽂件向外导出接⼝。
⽤户通过头⽂件找到库⽂件中函数实现的代码从⽽把这段代码链接到⽤户程序中去。
.a代表传统的静态函数库(也称作归档⽂件:archive).so代表共享函数库⼆、创建静态库⽂件:1.创建源⽂件willku1.c和willku2.c2.编译源⽂件⽣成.o⽂件(将要包含在库⽂件中的⽬标⽂件)gcc -c willku1.c willku2.c =>willku1.o willku2.o3.创建头⽂件ishead.h内容:void willku1(char *);void willku2(int);4.创建应⽤程序app.c(将调⽤willku2.c⽂件)#include "ishead.h"5.编译、测试应⽤程序app.cgcc -c app.cgcc -o app app.o willku2.o./app6.创建并使⽤库⽂件(.a),使⽤ar创建归档⽂件并将⽬标⽂件加进去。
动态库的创建与使用
动态库的创建与使用动态库是一种在程序运行时加载的库,它可以使用动态链接来提供共享代码。
在本文中,我们将介绍如何创建和使用动态库。
一、创建动态库动态库可以使用多种编程语言创建,如C、C++、Java等。
下面以C语言为例,介绍如何创建动态库。
1. 创建源文件首先需要编写源文件,可以是一个或多个C文件。
例如,我们创建一个名为“test.c”的文件,其中包含一个名为“test_func”的函数。
```#include <stdio.h>void test_func() {printf('Hello, world!');}```2. 编译生成动态库使用编译器将源文件编译生成动态库。
在Linux下,可以使用gcc命令,如下所示:```gcc -shared -o libtest.so test.c````-shared` 表示生成动态库,`-o` 后面指定生成的库文件名,这里我们命名为“libtest.so”。
3. 添加库文件路径在使用动态库时,需要告诉编译器库文件的路径。
可以使用环境变量LD_LIBRARY_PATH来设置库文件路径,如下所示:```exportLD_LIBRARY_PATH=/path/to/dynamic/library:$LD_LIBRARY_PATH ```其中,“/path/to/dynamic/library”为动态库所在的路径。
二、使用动态库使用动态库需要在程序中包含头文件并链接库文件。
1. 包含头文件在程序中包含动态库的头文件,如下所示:```#include <stdio.h>#include <test.h>```其中,“test.h”是头文件名,包含了动态库中的函数声明。
2. 链接库文件在编译程序时需要链接动态库文件,可以使用编译器的-L和-l 选项,如下所示:```gcc -o program program.c -L /path/to/lib -ltest```其中,“program.c”是程序源文件名,“-L”指定库文件所在路径,“-ltest”指定链接“libtest.so”库文件。
FORTRAN静态库动态库的生成
FORTRAN静态库、动态库的生成、维护与调用闫昊明2006-9-10一、FORTRAN静态库的生成与维护FORTRAN 静态库是经过编译的代码块,它与主程序相对独立,可以被主程序调用,是FORTRAN工程类型之一. 静态库包含一系列子程序,但不包括主程序. 静态库一般具有LIB扩展名并包含目标代码,且静态库存放在它们特定的目录中. FORTRAN静态库在组织大型程序和在不同程序之间共享子程序等方面具有较大的优点,其重要性不言而喻. 当将静态库与主程序联系起来时,在主程序中调用静态库中的任何子程序将编译到相应的可执行程序. 应用静态库的时候,只有所需要的子程序才在编译过程中插入到可执行文件(.EXE),这意味着这种可执行文件将比包含所有的子程序所生成的可执行文件小. 而且,不必担心哪些子程序是需要的,哪些是不需要的,编译器将替你做出选择. 同时,当更改静态库中的子程序时,相应的应用程序可以不做任何改变,而只需要对其进行重新的编译链接,即可获得新的结果,这无疑也是方便的.目前,常用的FORTRAN静态库有很多种,WINDOWS操作系统下的Compaq Visual FORTRAN version 6.5(简称CVF65)自带的数学统计库IMSL就是一个非常全面的静态库,可以用来解决线性代数和统计学上的很多经典问题. 此外,在NCAR互联网站有很多有用的FORTRAN子程序(网址:/softlib/mathlib.html),其中包括地球物理科学问题、离散和快速Fourier变换、可分离的椭圆微分方程、插值、Legendre多项式、普通数学问题、本征值问题求解、线性方程求解、非线性方程求解、常微分方程求解、特殊函数、统计学等常用子程序集等. 这些FORTRAN子程序可以解决很多基础性的问题,因此有很高的利用价值.在WINDOWS操作系统下,可以用两个命令分别生成静态库. 一个是用‘nmake’命令,它一般用来编译原来应用在UNIX环境下的FORTRAN子程序集,在编译过程中要读取makefile文件中的编译命令,类似于在UNIX下安装软件. 另一个是用‘lib’命令,它可以在WINDOWS环境下编译任何需要集成为静态库的子程序集.编译静态库在DOS命令行环境下比较方便,以后的命令行都指在此环境下运行. 在编译静态库前,首先要安装CVF65,其次要完成要编译的FORTRAN子程序(*.f90). 对于FORTRAN子程序,最好用FORTRAN90的标准来完成,应该放弃FORTRAN77标准。
动态链接库(dll)和静态库的创建及使用教程
动态链接库和静态库的创建及使用教程第一部分静态库(以vs2005为例)一、创建新的静态库项目1.从“文件”菜单中,选择“新建”,然后选择“项目…”。
2.从“项目类型”窗格中,选择“Visual C++”下的“Win32”。
3.从“模板”窗格中,选择“Win32 控制台应用程序”。
4.为项目选择一个名称,如“MathFuncsLib”,并将其输入“名称”字段。
为解决方案选择一个名称,如“StaticLibrary”,并将其输入“解决方案名称”字段。
5.按“确定”启动Win32 应用程序向导。
在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”。
6.从“Win32 应用程序向导”的“应用程序设置”页中,选择“应用程序类型”下的“静态库”。
7.从“Win32 应用程序向导”的“应用程序设置”页中,取消选择“附加选项”下的“预编译头”。
8.按“完成”创建项目。
向静态库添加类1.若要为新类创建头文件,请从“项目”菜单中选择“添加新项…”。
将显示“添加新项”对话框。
从“类别”窗格中,选择“Visual C++”下的“代码”。
从“模板”窗格中选择“头文件(.h)”。
为头文件选择一个名称,如“MathFuncsLib.h”,并按“添加”。
将显示一个空白文件。
2.添加一个名为“MyMathFuncs”的简单类,以执行常见的算术运算,如加、减、乘和除。
代码应与以下内容类似:// MathFuncsLib.hnamespace MathFuncs{class MyMathFuncs{public:// Returns a + bstatic double Add(double a, double b);// Returns a - bstatic double Subtract(double a, double b);// Returns a * bstatic double Multiply(double a, double b);// Returns a / b// Throws DivideByZeroException if b is 0static double Divide(double a, double b);};}3.若要为新类创建源文件,请从“项目”菜单中选择“添加新项…”。
如何建建立一个动态库和静态库
如何建建立一个动态库和静态库
第一步打开VS2010
第二步
文件(F)----->新建------>项目
选择应用程序设置
选择控制台应用程序选择空项目
点击完成
可以看到如下的
然后再建立一个项目
这里用名称 2 在解决方案中选择“添加到解决方案”
点击确定
弹出如图所示的
点击应用“程序设置”选择“DLL”选择附加选项中的“空项目”
点击完成这时可以看到
然后可以点击“解决方案”单机鼠标的右键
选择添加新建项目
应用程序设置静态库不要预编译头
点击finished 这时看到的是3
到这里我们的解决方案中有三个工程一个控制台程序1 一个动态的DLL工程2 一个静态的工程3 现在可以在项目中添加文件main.c
在解决方案中可以看到各个项目即文件夹下的有如下的文件
现在设置项目的依赖项
然后将三个程序编译以下
这是会发现前面动态链接文件和静态库文件可以编译成功但是控制台程序就不能够编译成功因为还有一些配置没有做好
在文件目录中可以看到
有lib和dll文件
现在配置项目1的属性
在链接器---》输入-----》附加依赖项
确定之后就可以编译了
能够成功链接了
十分欢迎交流,止于至善。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FORTRAN静态库、动态库的生成、维护与调用闫昊明2006-9-10一、FORTRAN静态库的生成与维护FORTRAN 静态库是经过编译的代码块,它与主程序相对独立,可以被主程序调用,是FORTRAN工程类型之一. 静态库包含一系列子程序,但不包括主程序. 静态库一般具有LIB扩展名并包含目标代码,且静态库存放在它们特定的目录中. FORTRAN静态库在组织大型程序和在不同程序之间共享子程序等方面具有较大的优点,其重要性不言而喻. 当将静态库与主程序联系起来时,在主程序中调用静态库中的任何子程序将编译到相应的可执行程序. 应用静态库的时候,只有所需要的子程序才在编译过程中插入到可执行文件(.EXE),这意味着这种可执行文件将比包含所有的子程序所生成的可执行文件小. 而且,不必担心哪些子程序是需要的,哪些是不需要的,编译器将替你做出选择. 同时,当更改静态库中的子程序时,相应的应用程序可以不做任何改变,而只需要对其进行重新的编译链接,即可获得新的结果,这无疑也是方便的.目前,常用的FORTRAN静态库有很多种,WINDOWS操作系统下的Compaq Visual FORTRAN version 6.5(简称CVF65)自带的数学统计库IMSL就是一个非常全面的静态库,可以用来解决线性代数和统计学上的很多经典问题. 此外,在NCAR互联网站有很多有用的FORTRAN子程序(网址:/softlib/mathlib.html),其中包括地球物理科学问题、离散和快速Fourier变换、可分离的椭圆微分方程、插值、Legendre多项式、普通数学问题、本征值问题求解、线性方程求解、非线性方程求解、常微分方程求解、特殊函数、统计学等常用子程序集等. 这些FORTRAN子程序可以解决很多基础性的问题,因此有很高的利用价值.在WINDOWS操作系统下,可以用两个命令分别生成静态库. 一个是用‘nmake’命令,它一般用来编译原来应用在UNIX环境下的FORTRAN子程序集,在编译过程中要读取makefile文件中的编译命令,类似于在UNIX下安装软件. 另一个是用‘lib’命令,它可以在WINDOWS环境下编译任何需要集成为静态库的子程序集.编译静态库在DOS命令行环境下比较方便,以后的命令行都指在此环境下运行. 在编译静态库前,首先要安装CVF65,其次要完成要编译的FORTRAN子程序(*.f90). 对于FORTRAN子程序,最好用FORTRAN90的标准来完成,应该放弃FORTRAN77标准。
FORTRAN90是FORTRAN语言从结构化走向面向对象化的重要一步,使FORTRAN语言更加接近C++。
在FORTRAN90标准中,对数组的操作既增强了功能又简化了使用,此外自由格式、MODULE、动态数组、指针等的应用大大丰富了FORTRAN语言,使得编程更加轻松。
目前,FORTRAN95和FORTRAN2000标准也在应用,它们与FORTRAN90标准比较类似,主要的改进在并行运算方面,因此目前在单机上应用的主要还是FORTRAN90. 在DOS命令行环境下,进入到FORTRAN子程序所在的子目录,然后按下面两个步骤生成FORTRAN静态库.(1)键入“df *.f90 /c”,回车,可以看到CVF65编译器对所有的FORTRAN子程序(*.f90)进行编译,生成*.obj文件(注意,编译时,/c中的“c”必须小写).(2)键入“lib *.obj /out:libname.lib”,回车,可以看到链接生成libname.lib静态库.需要注意的是,每次加入新的子程序或对静态库中的子程序修改以后,都要按上述两个步骤重新进行编译链接. 生成静态库以后,可用“dumpbin /linkermember libname.lib”来查看静态库中可用的子程序名称. 也可执行“lib /list libname.lib”来查看静态库中的*.obj文件.当然,也可以在CVF65集成环境下,生成静态库. 步骤如下:(a)进入到CVF65集成环境下,依次打开菜单File | New | FORTRAN Static Library. 为新的静态库命名,如:libname.lib.(b)依次打开菜单Project | Add to Project | Files,选择要编译的*.f90子程序到当前工作空间.(c)依次打开菜单Build | Compile和Build | Build进行编译链接,生成libname.lib静态库(在当前目录中的debug子目录下).当要编译的静态库需要其它静态库支持时,在步骤(b)中将支持库(*.lib)也加入到当前工作空间,即可顺利编译新的静态库.从上面的介绍可以看出,无论采用哪种方法,其基本步骤是一致的,即首先生成目标文件*.obj,然后再将这些文件链接成一个静态库文件*.lib. 对于简单的静态库可以按第一种方法在DOS环境下生成,对于需要其它静态库支持的子程序集则可以首先加入库的路径,再在编译时链接这些静态库,最后生成静态库文件.静态库生成以后还要经常进行更新和维护,以便更有效的利用这些资源. 下面给出维护静态库时常用的命令.(Ⅰ)将一个编译好的obj文件(如:ok.obj)加入到现有静态库(如:libname.lib),命令为“lib ok.obj libname.lib /out:libname.lib”.(Ⅱ)将两个或多个静态库合并成一个(all.lib),命令为“lib 1.lib 2.lib 3.lib /out:all.lib”,或“lib *.lib /out:all.lib”.(Ⅲ)列出静态库中的成员(MEMBER),成员对大小写敏感,命令为“lib libname.lib /list:[outputfilename]”,可给出静态库中的成员,即*.obj.(Ⅳ)从静态库中解出(extract)特定成员,命令为“lib libname.lib /extract:member”.(Ⅴ)从库中删除成员,命令为“lib libname.lib /remove:member”.二、FORTRAN静态库的调用FORTRAN静态库的调用主要有两种方式,第一种方式是在DOS环境下用命令行调用,其基本命令为“df *.f *.lib”,值得注意的是,在此种情况下,要设置合适的搜索路径(修改CVF65目录下的子目录bin中的文件dfvars.bat),也可以直接将自己的静态库拷贝到CVF65默认库目录下(CVF65根目录下的子目录lib中). 第二种方式是在CVF65环境下调用. 在此方式下有两种方法:方法一:首先对主程序进行编译,然后将静态库文件插入到当前工作空间(参考第一节步骤(b)),再进行链接,即可获得可执行文件. 方法二:对主程序编译后,依次打开菜单Project->settings…在对话框中选择Link选项卡,在Object/library models项下加入静态库文件的名字,再进行链接,同样可以获得可执行文件.上面所述的两种方法都比较麻烦。
下面介绍在FORTRAN90语言环境中应用MODULE来解决这一问题。
首先建立一个F90的module程序,名字为userlibmod.f90,对所有静态库中的子程序在此module程序中加入接口语句。
其基本结构如下(为便于叙述,在每行都加了行号,源程序中应无此行号):1.MODULE USERLIBMOD2.!DEC$OBJCOMMENT LIB:'LIBNAME.LIB'3.INTERFACE SUMAB4.SUBROUTINE INT_SUMAB(A,B,C)5.INTEGER A,B,C6.…7.END SUBROUTINE INT_SUMAB8.SUBROUTINE REAL_SUMAB(A,B,C)9.REAL A,B,C10.…11.END SUBROUTINE REAL_SUMAB12.END INTERFACE SUMAB13.INTERFACE14.SUBROUTINE CALENDAR(IY1,IM1,ID1,IY2,IM2,ID2,IUNITS,NDAYS)15.INTEGER,INTENT(IN):: IY1,IM1,ID1,IY2,IM2,ID2,IUNITS16.INTEGER,INTENT(OUT):: NDAYS17.…18.END SUBROUTINE CALENDAR19.END INTERFACE20.END MODULE从这个module的结构可以看出,第1行要给出module的名字,最好与文件名相同。
第2行告诉编译器要链接的静态库的名字(这里虽然看似注释语句,其实不是,此行可以在编译的过程中与编译器进行通讯,不能省略,不然可能造成编译错误)。
3到12行是一个有名接口语句,这里边有两个子程序(对整数和实数分别求和)。
我们可以用两个子程序名来分别调用对应的两个数求和,也可以用接口名来直接调用这两个子程序,当用接口名来调用时,如果输入的参数是整数,相当于调用int_sumab(a,b,c),如果输入的参数是实数,相当于调用real_sumab(a,b,c)。
所以在F90语言中,可以简化调用函数的个数。
13到19行定义了另外一个无名接口,接口中也可以加入多个类似14行到18行的子程序或函数,这些子程序或函数必须已经编译到静态库“LIBNAME.LIB”中。
20行是module 的结束语句。
将编辑好的module程序存盘,在命令行下执行“df userlibmod.f90 /c”,即可生成MOD文件“userlibmod.mod”。
将此MOD文件放入合适的地方,如“d:/myforlib/include/”,再将生成的静态库文件放入相应的路径,如“d:/myforlib/lib/”,则一个自己的静态库就建成了。
为了应用此静态库,首先要对CVF65设置合适的搜索路径。
打开CVF65集成环境,依次打开菜单“tools | options | directories”,在show directories for下拉菜单中依次点击“include files”和“library files”,然后再下面的“directories”中在空白处依次将“d:/myforlib/include/”和“d:/myforlib/lib/”加入,点击“ok”按钮,即完成了对搜索路径的设置。
现在,就可以方便的调用静态库中的子程序或函数了,只需要在你自己的主程序中第一行加入如下语句“use userlibmod”即可(如果第一行是“program yourprogramname”,则将其加入到此行的下一行)。