Linux下C++编程基础
 程序的执行顺序是:编译->链接->运行,通过g++命令的-c选项接文件名的形式将程序进行编译;接着通过g++ 接编译后的*.o文件进行链接,生成可执行程序;通过./程序名进行运行程序
 ldd 可执行程序,可以看到该可执行程序所链接的库
g++编译选项
 -fPIC,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,这正是共享库所要求的
 -shared,表明产生共享库
 -lpthread,多线程使用,lpthread是表示要连接到pthread的库是这里省略的lib,可在共享库找到libpthread.so
1、安装编译器gcc & g++
 yum install gcc //安装gcc
 yum install gcc-c++ //安装g++
2、编写第一个程序
[root@bogon 2018-11-08]# vi main.cpp 
#include <iostream>
using namespace std;
int main(){
  cout << "Hello World" << endl;
  return 0;
}
[root@bogon 2018-11-08]# g++ main.cpp 
[root@bogon 2018-11-08]# ls -a
.  ..  a.out  main.cpp
[root@bogon 2018-11-08]# ./a.out 
Hello World
g++ [文件名] //编译程序,在当前目录自动生成一个a.out的可执行文件
 ./a.out //执行程序
 g++ -o [可执行程序文件名] //指定自己想要生成的可执行程序的别名
3、多文件编程
 比如"main.cpp"包含"a.h",调用"a.c"中的函数,编译时需要一起编译:g++ a.c main.cpp -o HelloWorld2
4、编译-链接-运行
 //编译:通过g++命令的-c选项接文件名的形式将程序进行编译
 g++ -c a.c -o a.o
 g++ -c main.cpp -o main.o
//链接:通过g++ 接编译后的*.o文件进行链接,生成可执行程序
 g++ main.o a.o -o HelloWorld3
//库:查看可执行程序所链接的库,ldd [可执行程序]
 ldd HelloWorld3
//运行:通过./程序名进行运行程序
 ./HelloWorld3
5、编写makefile
 把所有.c和.cpp文件批量编译和链接,写入makefile脚本
[root@localhost cpp]# vim makefile 
start:
        g++ -o main.o -c main.cpp
        g++ -o a.o -c a.c
        g++ -o HelloWorld4 a.o main.o
clean:
        rm -rf a.o main.o
//makefile为脚本的名字
 //start可以随便命名, 这里写为start表示是程序的开始部分
 //start后面接的:,表示start为可以执行的部分,可通过命令make start执行
 //g++命令前面的空白部分,注意不是空格,必须是键盘左上角部分的tab键
 make或make start 执行脚本
 make clean,删除.o文件
6、makefile优化,定义变量,只编译缺少的文件
[root@localhost cpp]# cat makefile 
XX=g++
start:main.o a.o
        $(XX) -o HelloWorld4 a.o main.o
a.o:
        $(XX) -o a.o -c a.c
main.o:
        $(XX) -o main.o -c main.cpp
clean:
        rm -rf a.o main.o
//XX=g++,类似C++宏定义全局变量,定义方式:变量别名=变量值,使用方式$(变量别名)
 //start:main.o a.o,在执行start部分之前,先去查找main.o和a.o是否存在,不存在则去执行main.o和a.o部分,存在则直接进行链接
7、makefile优化2,重新编译修改的文件
[root@bogon 2018-11-08]# mv a.c a.cpp
XX=g++
start:main.o a.o
        $(XX) -o HelloWorld5 main.o a.o
.cpp.o:
        $(XX) -o $@ -c $<
clean:
        rm -rf a.o main.o
//
    
     
      
       
        <
       
       
        表
       
       
        示
       
       
        编
       
       
        译
       
       
        的
       
       
        以
       
       
        .
       
       
        c
       
       
        p
       
       
        p
       
       
        结
       
       
        尾
       
       
        的
       
       
        源
       
       
        文
       
       
        件
       
       
        ;
       
      
      
       <表示编译的以.cpp结尾的源文件;
      
     
    <表示编译的以.cpp结尾的源文件;@表示将编译的结果重命名为.o文件
 //当某个源文件被修改,会重新编译修改的文件,未修改的则不重新编译
8、makefile优化3,SRCS
[root@bogon 2018-11-08]# vi makefile 
XX=g++
SRCS=main.cpp\
        a.cpp
OBJS=$(SRCS:.cpp=.o)
EXEC=HellWorld6
start:$(OBJS)
        $(XX) -o$(EXEC) $(OBJS)
.cpp.o:
        $(XX) -o $@ -c $<
clean:
        rm -rf $(OBJS)
//OBJS=$(SRCS:.cpp=.o),表示将所有.cpp文件前缀文件名直接复制到文件名.o,这样当我们增加了.cpp文件后就不用手动去增加.o文件
9、补充
 make怎么知道哪些文件被修改:根据.cpp与.o的最后修改时间去判断是否需要编译,当.o文件都不存在时,则判断失去意义。
 make不涉及.h文件,g++编译时使用.h文件,g++ -E a.cpp -o a1.cpp,查看a1.cpp,可以看到a1.cpp是在预编译的时候包含.h中所有的内容的(ps,#include "a.h"放在系统头文件下面)










