
关于使用vscode编译《Linux/unix系统编程手册》配套代码遇到的问题解决
在使用《Linux/unix系统编程手册》时遇到很多例程,因为我是使用vscode远程Linux虚拟机学习,所以这里只介绍vscode如何编译书籍配套例程,首先默认你已经配置好基本的编译环境。
关于使用vscode编译《Linux/unix系统编程手册》配套代码遇到的问题解决
在使用《Linux/unix系统编程手册》时遇到很多例程,因为我是使用vscode远程Linux虚拟机学习,所以这里只介绍vscode如何编译书籍配套例程,首先默认你已经配置好基本的编译环境。
源码下载
首先去书籍中提到的网站下载配套源码,网站:书籍网站,源码下载网站:源码下载,我下载的是Distribution version
版本,另外一个是book
版本,两者基本内容一致,后者为书本上一样的版本,前者在后者基础上扩展了一些例程和功能、更加完整的注释,对于使用来说基本上一样。
源码文件内容
将源码压缩包复制到vscode工作区目录后,解压得到tlpi-dist/
文件夹:
#解压
jiaojian@KyLin:APUE$ tar -xzv -f tlpi-240311-dist.tar.gz
jiaojian@KyLin:APUE$ cd tlpi-dist/
#因为我已经编译过,会与刚解压出来的文件目录有些许差别
jiaojian@KyLin:tlpi-dist$ ls
acl COPYING.gpl-v3 filesys Makefile.inc namespaces procres signals threads
altio COPYING.lgpl-v3 getopt Makefile.inc.FreeBSD pgsjc progconc sockets time
BUILDING daemons inotify Makefile.inc.HP-UX pipes psem svipc timers
cap dirs_links lib Makefile.inc.MacOSX pmsg pshm svmsg tty
cgroups filebuff libtlpi.a Makefile.inc.Solaris proc pty svsem users_groups
CHANGES fileio list.txt Makefile.inc.Tru64 proccred README svshm vdso
consh filelock loginacct memalloc procexec seccomp sysinfo vmem
COPYING.agpl-v3 files Makefile mmap procpri shlibs syslim xattr
jiaojian@KyLin:tlpi-dist$
可以仔细阅读一下README
和BUILDING
这两个文件,这两个文件是使用源码、编译源码的关键,后面所有的描述都是根据这两个文件,特别是BUILDING
文件。另外需要注意的就是lib/
目录,下面将讲到。
源码编译与vscode配置步骤
1、首先在顶层文件夹tlpi-dist/
下直接make
,编译所有子目录中的代码,这一步是为了检查你系统的编译环境是否适合本源码。
若编译出现错误比如缺某个<sys/xxxx.h>
文件,这是因为你的系统缺少本源码需要的库,BULIDING
中提到,本源码需要库如下:
Debian, Ubuntu, and similar distributions:
libcap-dev
libacl1-dev
libcrypt-dev
libselinux1-dev
libseccomp-dev
RPM-based distributions (Fedora, OpenSUSE, CentOS, etc.):
libcap-devel
libacl-devel
libselinux-devel
libseccomp-devel
libxcrypt-devel
根据自己的系统,安装即可,安装库出现问题不在本文讨论范围内,我使用的是Ubuntu系统。
2、编译源码的lib
库
若上一步可以通过make
顶层Makefile
完成整个源码的编译,说明你的系统编译环境适用该源码,可以先make clean
清理一下编译出来的目标文件和可执行文件。需要说明的是,作者将源码中需要的头文件大部分都放在lib/
目录下,并且将一些作者自定义函数封装为一个静态库,因此若想在vscode中编译、调试书本例程,就必须先编译lib/
中的代码并得到该静态库。
直接进入lib/
目录,make
一下就行,它会自动编译并封装出一个名为libtlpi.a
的静态库,并且将libtlpi.a
库移动到顶层目录tlpi-dist/
下。
编译完lib/
目录后基本上就完成了源码的编译环境配置,后面就是vscode配置了。
3、vscode配置,添加头文件目录和静态库到配置文件中
添加头文件目录直接修改工作区.vscode/
目录下的c_cpp_properties.json
和tasks.json
文件
#如我的c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include"
],
"defines": [],
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64",
"compilerPath": "/usr/bin/gcc",
"compilerArgs": [
"-I${workspaceFolder}/inc",//我自己项目的头文件目录
"-I${workspaceFolder}/tlpi-dist/lib",//这一句是gcc编译、调试时添加包含头文件目录
"${workspaceFolder}/tlpi-dist/libtlpi.a"//这一句是gcc编译、调试时,添加libtlpi.a
]
}
],
"version": 4
}
#如我的tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc 生成活动文件",
"command": "/usr/bin/gcc",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-I${workspaceFolder}/inc/",//我自己项目的头文件目录
"-I${workspaceFolder}/tlpi-dist/lib",//执行task时,gcc参数加上lib/头文件目录
"-lcrypt",
"-pthread",
"${workspaceFolder}/tlpi-dist/libtlpi.a",//编译时添加libtlpi.a静态库
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
根据自己的环境情况添加即可,tasks.json
文件是任务编译说明,配置好后可以在源文件编辑界面直接shift + ctrl +b
快捷键按照tasks.json配置进行单个源代码编译,而不用在终端傻傻的敲gcc -巴拉巴拉
的了。调试部分应该是根据c_cpp_properties.json
中的配置,这里关于vscode c/c++
基础性配置知识的我就不再赘述了。
最后,这本《Linux/unix系统编程手册》,我TM吹爆,虽然里面有些地方讲解的比较啰嗦和些许含糊,可能是翻译的问题也可能是我自己基础不行,但是不妨碍这本书真的牛逼,学到了很多知识,相对于APUE来说稍微简单易懂些,可以对照着看,YYDS。
更多推荐
所有评论(0)