Linux tlpi库编译后调用的解决

linux tlpi是 linux programming interface 这本书配套的代码,可以直接在tlpi-dist的根目录下进行make,初次make可能会报错,输入搜索之后发现需要安装两个库。

  • sys/capability.h 找不到头文件 解决: sudo apt-get install libcap-dev
  • sys/acl.h 找不到头文件 解决:sudo apt install libacl1-dev

然后参考这个步骤: https://github.com/qeesung/tlpi

How to setup env

Download the tlpi source code.

wget "http://man7.org/tlpi/code/download/tlpi-161214-dist.tar.gz"

Unzip the source code, and compile.

tar -zxvf tlpi-161214-dist.tar.gz
cd tlpi-dist/
make -j

Copy the header files to the system include directory.

cd lib/
sudo cp tlpi_hdr.h /usr/local/include/
sudo cp get_num.h /usr/local/include/
sudo cp error_functions.h /usr/local/include/
sudo cp ename.c.inc /usr/local/include/

Make a static shared library.

g++ -c get_num.c error_functions.c
ar -crv libtlpi.a get_num.o error_functions.o
sudo cp libtlpi.a /usr/local/lib

How to compile a c file and run it

g++  -ltlpi -o 
./

这里需要说明一下,安装完 build-essential 之后,会有默认的cc指令,c compiler. 但是我们装的是gcc一套的东西,这里用的是g++。
在linux下看其链接的过程

gcc link relationship.png

可以看到cc这个指令链接的完整过程,其实最后cc指令软链接(ln指令)的是标号5的文件。
上面有两步骤:1. 拷贝头文件 2.编译lib库,拷贝lib库。
主要看编译的那部分:g++ -c get_num.c error_functions.c 在linux下查看g++, 使用指令man g++, 看到For example, the -c option says not to run the linker,说白了就是只编译不链接。为了进一步确认,我找了GNU的GCC下关于-c的j解释,GCC options

-c
Compile or assemble the source files, but do not link. The linking stage simply is not done. The ultimate output is in the form of an object file for each source file.
By default, the object file name for a source file is made by replacing the suffix ‘.c’, ‘.i’, ‘.s’, etc., with ‘.o’.
Unrecognized input files, not requiring compilation or assembly, are ignored.

这里生成的仅仅是 *.o的文件,也就是windows下obj文件,还不能被使用。再使用ar指令(linux下压缩备份指令,创建修改备份文件)生成 *.a文件,也就是linux下的静态库文件。生成名字为 libtlpi.a 的静态库文件。这时候 头文件,静态库文件都有了,可以用在其他的程序中了。这里把静态库文件拷贝到用户区的lib文件夹下,类似于windows的环境变量,编译的时候系统会从这些地方找,就不用拷贝到指定的那个目录下面了。这里有一篇如何用gcc生成静态库的文章

最后在编译的时候 要显式的指明使用的静态库文件参数,因此需要添加-ltlpi库,不然编译通不过。

你可能感兴趣的:(Linux tlpi库编译后调用的解决)