函数库学习入门指引

在学习某一函数库的时候,我们经常做的第一件事,就是把该函数库的源码下载回来进行编译和安装(一般是这三步:./configure -> make -> make install),然后写一些调用库函数的小用例,看其能否正常运行以及运行后的效果。完成库函数安装,当我们满心期待地使用GCC进行用例编译的时候,却经常遇到以下问题:


test.c:X:XX: fatal error: XXXX.h: No such file or directory
compilation terminated.


又或者


test.c:(.text+0XX): undefined reference to `XXXX'
collect2: ld returned 1 exit status


一些同学遇到这样的问题后,倒腾几个小时没能找到解决问题的方法,心生畏难情绪,最终倒在库函数学习的入门门槛上。


下文通过分析问题出现的原因,结合glib函数库实例,提出解决方法,一步步地引导初学者进行函数库入门学习(这篇文章以C/C++源码作为讨论的基础,默认的编辑器是GNU下的GCC和CC)。


1.原因分析


首先分析以上问题出现的原因,我们先要了解这些知识:编译和链接原理,GCC头文件和库文件的查找路径。


程序的编译和链接:在进行程序编译时,编译器会检查语法是否正确,检查函数与变量的声明,这需要我们告知编译器我们的函数和变量声明在哪个头文件。语法正确并且相关头文件的路径都给到编译器后,编译器将编译出中间目标文件(.o或是.obj文件)。


在进行程序链接时,链接器会在所有中间目标文件或者库文件(它由中间目标文件打包而成)中查找函数的实现,如果链接器未查找到函数实现,它将返回链接失败消息。


知道这些之后,对照文章开头列出的出错消息,出错原因就很明显了。第一种出错情况是程序编译时未找到某个头文件;第二种是由于链接器未找到某函数所依赖的库文件或者该函数压根就没有实现。


GCC去哪找头文件和库文件呢?GCC有其默认的查找路径,对头文件的查找在/usr/include,/usr/local/include等目录下,编译时可以通过GCC的-I选项指定头文件的查找目录;对库文件的查找在/usr/lib,/usr/local/lib等目录下,编译时可以通过GCC的-L选项指定库文件的查找目录。


显然,上面错误消息里的头文件/库文件并不在GCC默认的头文件/库文件查找路径里。它们被安装到了哪里?


2.解决方法


通过查看函数库源码文件中的Makefile我们可以知道函数库的头文件和库文件安装的路径,以glib函数库为例,这里我们只看其Makefile(由./configure命令生成)中的几个字段。


prefix = /usr/local

exec_prefix = ${prefix}

includedir = ${prefix}/include

libdir = ${exec_prefix}/lib


这几个值指定了glib函数库的头文件/库文件的安装路径,在执行make install命令后,头文件和库文件将被分别安装到指定路径。


另外,我们可以使用locate命令定位头文件和库文件的路径,例如locate glib,包含"glib“字段的文件名的完整路径将被列出来,再自行定位库文件和头文件的路径。


假设我们已经从源码安装好了glib函数库,我们试着跑个Hello word小程序验证安装结果。


 #include <stdio.h>
 #include <glib.h>
  
 int main(void)
 {
      g_printf("hello world!\n");
  
      return 0;
 }


执行


gcc -I /usr/local/include/glib-2.0/ -I /usr/local/lib/glib-2.0/include/ -lglib-2.0 -o hello hello.c


由于glib库文件已被安装在GCC默认的库文件链接目录下(/usr/local/lib/),所以这里没有指定库文件搜索路径。

试试执行


gcc -o hello hello.c

gcc -I /usr/local/include/glib-2.0/ -I /usr/local/lib/glib-2.0/include/  -o hello hello.c


看有什么结果:)


另一个能帮助我们解决头文件或库文件路径问题的工具是pkg-config,许多函数库都支持pkg-config命令,在glib的Makefile中,有该条语句:pkgconfigdir = $(libdir)/pkgconfig,它指示了glib对应的.pc文件(即glib-2.0.pc)安装路径。我们来看glib-2.0.pc文件里有哪些主要内容:


prefix=/usr/local

exec_prefix=${prefix}

libdir=${exec_prefix}/lib

includedir=${prefix}/include

Libs: -L${libdir} -lglib-2.0

Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include


Cflags给出编译时所需的选项,Libs给出了链接时所需的选项,然后这样使用pkg-config命令:


gcc `pkg-config --cflags --libs glib-2.0` -o hello hello.c


知道问题出现原因和解决方法,下次编译时再遇到“No such file or directory”或者“undefined reference to `XXXX'”,就不怕了吧?


本文参考了以下文章:《跟我一起写Makefile》by陈皓

                《Makefile好帮手:pkgconfig》by李先静

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python是一种简单易学的编程语言,适合零基础入门。下面我将介绍一些入门Python编程的建议和方法。 首先,你可以开始学习Python的基础语法。Python具有直观的语法和清晰的代码结构,使得初学者容易理解和掌握。你可以通过观看在线教程、学习Python编程书籍或参加编程培训课程来学习这些基础知识。 其次,你需要学习如何使用Python的编程工具和环境。Python具有许多IDE(集成开发环境)和编辑器供你选择,例如PyCharm、Jupyter Notebook或者VS Code等。通过熟悉并选择一个适合你的开发环境,你可以更方便地进行Python编程。 进一步学习Python的编程概念和技巧也很重要。学习数据类型、变量、运算符、控制流语句、函数等基础知识,这些是编写Python程序的基础要素。你可以编写简单的程序来实践和巩固这些概念。 另外,学习如何使用Python的库和模块对你的编程技能也非常有帮助。Python拥有丰富的第三方库和模块,可以帮助你实现各种功能。例如,NumPy和Pandas用于数据分析,Matplotlib和Seaborn用于数据可视化,Requests和BeautifulSoup用于网络爬虫等等。通过学会使用这些库,你可以扩展你的Python编程能力。 最后,不断实践和练习是提高编程水平的关键。尝试解决一些简单的编程问题,挑战你的思维和解决问题的能力。参与开源项目或者与其他编程爱好者交流也能够提高你的编程技能。 总之,零基础入门Python编程需要学习基础语法、选择适合的编程工具和环境、掌握编程概念和技巧、学习使用Python库和模块以及不断实践和练习。通过这些步骤,你将能够逐渐掌握Python编程的基础知识并提升你的编程能力。祝你学习顺利! ### 回答2: Python编程是一门非常适合零基础入门的编程语言。以下是一些帮助你开始学习Python的建议。 首先,你可以选择一本适合初学者的Python教程或者参加一些零基础的编程课程。这样的教程或者课程通常会涵盖基本的Python语法和常用的编程概念。 其次,你可以通过编写简单的程序来实践你学到的知识。例如,你可以尝试编写一个打印“Hello, world!”的程序,或者编写一个简单的计算器程序。 此外,互联网上也有许多免费的资源供你学习和提高Python编程的能力,如网上教程、视频教程和博客等。你可以选择一些适合自己的学习资源,根据自己的进度进行学习。 另外,加入一个编程社区或者论坛也是一个不错的选择。你可以在这个社区与其他Python爱好者互动,分享经验,互相学习和解决问题。 最重要的是,保持持续的学习和实践。编程是一个需要不断练习和尝试的过程,通过反复练习和实践,你会逐渐熟悉Python的语法和编程思维,并且能够编写更复杂的程序。 总的来说,Python编程零基础入门并不困难。通过选择适合自己的学习资源,实践和坚持不懈,你会慢慢的掌握Python的基础知识,并且能够编写简单的程序。 ### 回答3: Python编程是一种非常适合零基础入门的编程语言。下面我来简单介绍一下Python编程的入门步骤。 首先,你需要安装Python解释器。Python是一种解释型语言,可以直接在电脑上安装并运行。你可以从Python官方网站上下载最新的Python版本,并按照指引将其安装到你的电脑上。 接着,你可以通过学习一些基本的Python语法来入门。Python语法相对简单易懂,你可以从基本的数据类型(如整数、浮点数、字符串)开始学习,并了解如何进行基本的数学计算、字符串处理等操作。你可以通过在线教程、学习网站或者参考一些入门教材来学习Python的语法知识。 一旦你掌握了基本的语法知识,你可以开始编写一些简单的Python程序。比如,你可以编写一个简单的计算器程序,或者一个打印特定信息的程序。这些简单的练习可以帮助你理解如何使用Python语法来解决问题。 在练习编写程序的过程中,你可能会遇到一些错误和问题。不要担心,这是正常的。通过查阅Python的官方文档、网上的编程论坛或者寻求帮助,你可以找到解决问题的方法。 此外,Python社区也提供了很多学习资源和工具,可以帮助你更好地入门。比如,有一些交互式编程环境(如Jupyter Notebook)可以帮助你在学习过程中进行实时的代码调试和运行。 最重要的是,不断练习!编程是一门实践性强的学科,只有通过不断的练习才能加深理解和提高编程能力。你可以选择一些简单的项目来挑战自己,并逐渐提升编程的难度。 总结起来,Python编程的零基础入门主要包括安装Python解释器、学习基本的语法知识、练习编写简单的程序、解决问题、利用资源和工具辅助学习,并且不断进行实践和练习。祝你在Python编程的学习过程中取得好成果!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值