菜鸟学习gsl科学计算库第一步——程序编译过程



首先敲好代码。如:
#include<stdio.h>
#include<gsl/gsl_sf_bessel.h>
int
main()
{
 double x = 5.0;
 double y = gsl_sf_bessel_J0(x);
 printf("J0(%g) = %.18e\n",x,y);
 return 0;
}
上面是gsl帮助手册上给出的一个例子,我保存为j.c。接下来我们的重点是如何进行编译它。
linux下面最常用的编译器就是GCC。因此主要介绍如何使用GCC对程序进行编译。
下面的方法是帮助手册上给出的。
    1、我们所用的科学计算库GSL的头文件(.h),如果你是默认安装的话,会放在/usr/local/include/gsl目录下,大家可以找到。所以程序开始我们所include的gsl_sf_bessel.h也会放在里面。所以我们进行编译的时候第一步就是要告诉编译器我们在程序中包含库的位置:
gcc -Wall -I/usr/local/include -c j.c
-Wall是打开所有警告的参数,使用它可以显示在编译过程中的所有警告信息
-c作用是编译产生对象文件(*.obj)而不链接成可执行文件,当编译几个独立的模块,而待以后由链接程序把它们链接在一起时,就可以使用这个选项。
使用上述命令后我们就会发现我们文件目录下出现了个.o文件。这是编译后的目标文件,即含有最终编译出的机器码,但它里面所引用的其他文件中函数的内存位置尚未定义,也就是告诉了编译器我们要包含的头文件,但头文件里面的函数在什么地方在什么地方却还不知道。
所以我们接下来的任务就是告诉编译器我们所需要的函数的位置再什么地方。
    2、我们所需要的函数都放在了库文件里面。
库文件有三种:.a(静态库文件), .so(动态库文件), .s(汇编源文件)
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为”.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为”.so”,gcc在编译时默认使用动态库。
库文件默认存放的地址是/usr/local/lib.我们使用的命令是:
gcc -L/usr/local/lib j.o -lgsl -lgslcblas -lm
-L后面的内容是我们库文件放置的地方。
j.o是第一步我们生成的文件。
-lgsl是指定我们链接的,库全名是libgsl.a和libgsl.so。使用的方法是-l加上库的名称,即去掉lib以及后缀剩下的部分。
-lgslcblas链接的是libgslcblas.a。这是科学计算的核心库
-lm链接的是标准数学库
    3、接下来就是最后一部运行我们的程序了。
在执行完我们的上一步的时候就发现我们又多了一个a.out的文件,但如果我们直接执行,输入./a.out之后我们可能会发现显示有错误。这可能是因为动态库没有找到。

比如$ ./a.out
./a.out: error while loading shared libraries:
libgsl.so.0: cannot open shared object file: No such
file or directory 
这需要我们修改动态库配置或者是定义shell变量LD_LIBRARY_PATH。
比如在输入./a.out之前加上命令export LD_LIBRARY_PATH=/usr/local/lib
这样就可以了。
注意,以上内容都是我在centos操作系统下作的,都是帮助手册上的内容,大家都可以找到英文的文献。当我在Ubuntu下面作的时候,似乎又没有这么复杂。
当然我们可以将上面的代码整合起来。比如输入:
gcc -I/usr/local/include -L/usr/local/lib j.c -lgsl -lgslcblas -lm
export LD_LIBRARY_PATH=/usr/local/lib
./a.out

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值