linux下编程学习日志(一)

时间:2022-08-25 06:51:41

  快毕业了,辞了php后台工作,无所事事,linux接触的很少,只在某个课的实验课接触过centos,为了再找工作,所以打算学习一下在linux下编程,于是借了一本UNIX环境高级编程,听说需要深厚的操作系统知识与C语言知识…….这么一听快把我劝退了,因为我没学过操作系统,也就大概的了解过一下,不过还是打算慢慢啃,顺便熟悉linux的操作。
  该日志仅记录一些我个人感觉有些重要的东西,如配置一些软件碰到的问题。

 ps:使用书籍及系统《UNIX环境高级编程》、redhat-linux

一、linux基础使用

  参考:https://www.linuxprobe.com/chapter-01.html
  上面的网址中有虚拟机、linux配置教程,以及linux的一些教学(我就看到第4章,我个人觉得自己是偏向编程而不是运维,所以后面的知识暂时没学)。


二、替换RedHat中的yum

  因为在编译apue(unix环境高级编程附带的文件)出错,需要安装一些文件,但是使用不了yum,因为redhat的yum是要付费还是注册用户才能使用,所以要替换成centos的yum。
  参考:https://www.linuxprobe.com/redhat-7-use-centos-yum-network-sources.html
  在参考上面的网址一步一步做的过程时(我使用的是centos源:http://centos.ustc.edu.cn/centos/7/os/x86_64/Packages/),由于网页的内容是以前的了,很多软件包都在更新,以至于要更新rpm的版本,所以照着上面网址做,就会出错,错误类似于下图(下图是我在更新rpm),发现安装不了yum包,提示Failed dependences: rpm=4.11.3……之类的,而我未更新rpm之前是4.11.1,下图则是我在更新rpm的时候,提示我的rpm4.11.1与rpm-libs….之间存在依赖,所以我要一并更新这些存在依赖的文件(安装yum之前需要卸载原先的yum)。

linux下编程学习日志(一)
  下图为centos源中的rpm包,紫色的是我更新rpm所下载的文件:
linux下编程学习日志(一)

  更新成功后,再按照参考网址上的,配置repo,就可以使用了,下图为yum包安装成功图。
linux下编程学习日志(一)
  由于对linux不太会使用,我是在windows上搜索关键字 rpm-与yum-来进行下载,linux终端提示少什么,我就下什么,然后复制粘贴到linux系统下,当然,你也可以直接wget下载。

三、GCC的使用

  GCC的编译过程,了解一下:https://www.cnblogs.com/king-lps/p/7757919.html
  引用一下这篇博客:https://blog.csdn.net/gvfdbdf/article/details/52457139

我们用gcc编译程序时,常常会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:
例:
gcc -o hello hello.c -I/home/hello/include -L/home/hello/lib -lworld
1
上面这句表示在编译hello.c时:
-I /home/hello/include,表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include–>/usr/include–>/usr/local/include
也就是指定优先查找的目录,找不到的话查找默认目录
-L /home/hello/lib,表示将/home/hello/lib目录作为第一个寻找库文件的目录, 寻找的顺序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib
同上,也是指定优先查找的目录
-l word , 表示**寻找动态链接库文件**libword.so(也就是文件名去掉前缀和后缀所代表的库文件)
如果 加上编译选项-static,表示寻找静态链接库文件,也就是libword.a
对于第三方提供的动态链接库(.so),一般将其拷贝到一个lib目录下(/usr/local/lib),或者使用-L来指定其所在目录, 然后使用-l来指定其名称

  在编译apue中开篇的这段程序,若要调用err_quit函数,则需要调用静态库文件libapue.a,所以也就是用到gcc链接动态或者静态库,来调用函数,当我们下面的文件是以.cpp格式保存,即C++的文件,链接libapue.a会无效,可能是C++调用C写的静态库需要修改,按c方式编译的话可以正常调用err_quit函数。

#include"apue.h"
#include<dirent.h>

int main(int argc, char const *argv[])
{
    /* code */
    DIR *dp;
    dirent *dirp;
    if (argc!=2){
        exit(0);
    }
    if((dp=opendir(argv[1]))==NULL){
        printf("can't open %s",argv[1]);
        //err_quit("can't open!!");  C++编译的时候调用静态库失败..所以注释掉了 
        exit(0);
    }
    while((dirp=readdir(dp))!=NULL){
        printf("%s\n",dirp->d_name);
    }
    closedir(dp);
    printf("end");
    return 0;
}

  按c++去编译代码,结果如图:
linux下编程学习日志(一)

  按c去编译代码,结果如图:
linux下编程学习日志(一)

  今天就记录到这~