0
点赞
收藏
分享

微信扫一扫

linux下C++编程基础

苦茶如歌 2022-04-30 阅读 138
c++linux

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"放在系统头文件下面)

举报

相关推荐

0 条评论