Linux上C语言标准数学函数库的引用

      

       eclipse安装了CDT插件之后就可以在上面编辑、编译、链接、运行C/C++程序了,但是不同于gcc编译器的纯命令行操作,eclipse上基本上都是通过图形化界面实现的,只需要进行简单的设置就可以实现特定的功能。函数库通常可以静态链接库(*.a文件)和动态链接库(*.so文件)的形式存在,在Linux中,调试一个程序如若需要用到非标准的C函数库,例如用到标准数学函数库,则需要进行特别指明。


   1.问题说明

      我在设计一个程序时,程序中用到了sqrt()函数,在Windows上Visual Studio中开发时无需特别指明所需要应用到的链接库,但是在 Linux系统下就会出现如下问题。

     在eclipse 中的问题如图示:    

     Linux上C语言标准数学函数库的引用_第1张图片

   

    意思是说“没有定义引用的sqrt函数”,系统找不到sqrt()函数的链接文件。

    同样的问题出现在Linux中为:

   

   

      问题原因:总得来说是系统找不到定义sqrt()的标准数学函数库libm.a/lib.so,标准数学函数库不同于C语言标准函数库,而Visual Studio上可以实现自动比较差异并实现自动正确引用,无需用户特别指明,但在Linux上需要用户理解其中的关系并显示指明



  2.解决问题

         先从命令行出发,因为eclipse上的配置也是根据命令行来的。两种问题的解决思路分别如下所示:

      2.1 Linux命令行

         在编译时(更准确地说是在链接时)指定引用的标准数学函数库,如下所示:

[sheng@lls src]$ gcc -o ACO  ACO.c -lm

          -lm是简写,它代表的是标准库目录(在我所用的CentOS6.5中是/usr/lib64)中名为libm.a或者libm.so的函数链接库。-lm的好处是如果有动态链接库(共享库),编译器会自动选择动态链接库库,即lib.so文件(如果存在)比libm.a有更高的优先级。在我的CentOS6.5系统中,libm.a与libm.so的位置为:

[root@lls Desktop]# find / -name libm.so
/usr/lib64/libm.so
/usr/lib/x86_64-redhat-linux5E/lib64/libm.so
[root@lls Desktop]# find / -name libm.a
/usr/lib/x86_64-redhat-linux5E/lib64/libm.a
        因此系统会选择/usr/lib64/libm.so文件进行链接(在我的CentOS 6.5系统中,该文件为符号链接文件,经过多层链接之后指向/lib64/libm-2.12.so)。因此命令行下的解决方法等同于:

[sheng@lls src]$ gcc -o ACO  ACO.c /usr/lib64/libm.so


      2.2 eclipse的CDT插件

        同样,解决方法的原理是一样的,在编译时(更准确地说是在链接时)指定引用的标准数学函数库。方法为:选中项目后右键->Properities->C/C++ Build->Settings->GCC Linker->Miscellaneous->在右边栏目Other options(-Xlinker [linker])中添加-lm,然后确认就行了。如下图所示:

      Linux上C语言标准数学函数库的引用_第2张图片



总结:我已经适应了Windows上的“傻瓜式”的开发方式,但是在Linux平台上,我需要知道更多的偏向底层配置之类的高大上的知识,这样能够加深对技术的理解。但这个学习过程是很麻烦的,不过乐也在其中。






你可能感兴趣的:(C,Linux)