关于使用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$ 

可以仔细阅读一下READMEBUILDING这两个文件,这两个文件是使用源码、编译源码的关键,后面所有的描述都是根据这两个文件,特别是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.jsontasks.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。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐