2018年5月

一、问题描述

运行程序时出现以下错误,原因是程序运行时需要的动态库找不到:

./app: error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory

解决方案有以下三种。

二、解决方案

2.1 方案1

把需要的库文件复制到系统的默认库路径下:

> sudo cp libxxx.so /lib

- 阅读剩余部分 -

一、静态库和动态库

静态库是指程序在编译阶段就把库文件嵌入到程序中的三方库,这种行为在程序运行前就已经决定了,程序在编译完成后不再依赖库文件。

动态库和静态库不一样,它是在程序运行期间才发生的调用行为,不会嵌入到程序,相对来说,链接动态库的二进制文件体积更小。

windows和linux平台下的静态/动态库后缀分别为lib dll.a .so,其中linux中动态库的命名规则为:libxxx.so.x.y.z,xxx表示库名,x是主版本号,y是此版本号,z是发行版本号。

- 阅读剩余部分 -

  • -l:表明需要一起编译的库文件。
  • -L:添加库文件所在的目录,只针对静态库。
  • -c:生成目标文件*.o
  • -o:指定输出文件。

静态库的使用方法

库文件名字为libxxx.a或者libxxx.so,使用时通过-l链接:

gcc -lxxx main.c

如果库文件不在/lib, /usr/lib/usr/local/lib三者中的任一个文件夹的话,要通过-L选项指定库所在的目录,否则会报错:/usr/bin/ld: cannot find -lxxx

> make
gcc main.c -lfunc1 -o debug/app # 没有制定库所在路径报错
/usr/bin/ld: cannot find -lfunc1
collect2: error: ld returned 1 exit status
Makefile:9: recipe for target ''app'' failed
make: *** [app] Error 1
> vi Makefile # 修改Makefile添加-L选项
> make
gcc main.c -L. -lfunc1 -o debug/app # 编译成功

一、Makefile概述

一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。Makefile的基本语法规则为:

目标: 依赖
    操作

例如我们要把一个main.c编译成app,这里目标是app,源是main.c,编译的命令为gcc main.c -o app。那么它的Makefile为:

app: main.c
    gcc main.c -o app

- 阅读剩余部分 -

一、时间介绍

unix环境下一共有两种时间值:

  1. 日历时间(Calendar time):该值是自1970年1月1日00:00:00以来所经过的秒数累计值,也叫国际标准时间(UTC,早期的手册称UTC为格林尼治标准时间),这些时间值可用于记录文件最近一次的修时间等,是最常用到的时间。
  2. 进程时间(Process time):也被称作CPU时间,用来度量进程使用的中央处理器资源,它由时钟滴答(clock ticks)表示,每秒50、60或者100个时钟滴答。

通常当我们度量一个进程的执行时间时会包含三种时间属性:时钟时间、用户CPU时间和系统CPU时间。

时钟时间(wall clock time)指进程运行所花费的时间,也就是命令开始执行到结束的时间。它的值与系统中其他的进程数量有关,包括了其他进程所占用的时间和进程被阻塞时所花费的时间。

用户CPU时间是指进程执行用户指令所花费的时间,系统CPU时间则指进程在进行系统调用时占用的时间(例如当我们执行openwrite等函数时)。用户CPU时间和系统CPU时间的和被称为CPU时间。

- 阅读剩余部分 -

pkg-config的作用是列出系统中库的基本信息,例如,查询pcre库的相关信息:

$ pkg-config --libs libpcre2-8
-L/usr/local/pcre2-10.31/lib -lpcre2-8

常用选项为:

  • --list-all:列出所有已安装的共享库。
  • --cflags:列出指定共享库的预处理和编译flag。
  • --libs:列出指定共享库的链接flag。
$ pkg-config --list-all # 列出所有的库地址
lua5.1-rrd       Lua rrd - Lua rrd engine
tic              tic - ncurses 6.0 add-on library
lua51-c++        Lua - Lua language engine
lua5.1-bitop     Lua bitop - Lua bitop engine
ncurses          ncurses - ncurses 6.0 library
lua5.2-bitop     Lua bitop - Lua bitop engine
menu             menu - ncurses 6.0 add-on library
python-3.5m      Python - Python library
systemd          systemd - systemd System and Service Manager
...

$ pkg-config --cflags --libs libpcre2-8 # 找出pcre库相关的文件信息
-I/usr/local/pcre2-10.31/include -L/usr/local/pcre2-10.31/lib -lpcre2-8

- 阅读剩余部分 -