1使用命令行编译程序
Linux下的编译器
在Linux下,我们使用g++或gcc来编译程序。 g++ : 编译C++代码
gcc: 编译C的代码
(注:gcc也可以编译C++代码,相对麻烦一些)
示例1
编译单个源文件:
第一步:g++ main.cpp ‐o helloworld
其中,
g++ 编译器
main.cpp 源文件列表
‐o helloworld : 输出文件(output)
第二步:运行程序
./helloworld
示例2
编译多个源文件:
g++ main.cpp other.cpp ‐o helloworld
(展示编译出错、修改代码、重新编译的过 程)
注意事项
(1) 编译的时候,只指定源文件(.cpp),不指定头文件(.h)
(2)在Linux下文件名区别大小
(3) 程序的运行
./helloworld 前面必须加路径 ,不能写成 helloworld
小结:
第一步;编译 g++ main.cpp other.cpp ‐o helloworld
第二步:运行 ./helloworld
2Linux下的可执行程序
可执行程序
“可执行”
是一个形容词
① 该文件是一个程序文件
② 该文件有x属性
满足这两个条件,它才能执行。
可执行程序
$ ls ‐l helloworld
‐rwxrwxr‐x 1 mytest mytest …
首先它是一个程序文件,然后它有x属性,所以 它可以被执行。
PATH环境变量
PATH环境变量描述了可执行程序的搜索路径
/bin:/usr/bin:/usr/local/bin 。。。 若干路径位置,以分号隔开
显示PATH的值:
echo $PATH
当你输入一个命令名时,系统会从PATH描述的路径里 搜索此命令
所以,直接输入helloworld会显示“命令找不到 (command not found)
第一种办法:执行程序时加上路径 ./helloworld
/home/mytest/…/helloworld
第二种办法:把helloworld拷贝到PATH的某个目录下
第三种办法:重设环境变量PATH
在Windows能执行吗
- 文件格式不一样
- 指令集可能不一样
- 大小端不一样
- 总结一下:平台一样,没法跨平台执行
Linux下,不关心后缀,只关心权限。
小结:
1,可执行程序
2,PATH环境变量
3,与windows区别
3 编译与链接
编译与链接
程序的生成过程分为两步:
编译:compile,将*.cpp ‐> .o
链接:link, 将所有的.o ‐> executable
(VC展示这两步过程。。。)
在Linux下开发时,要严格区分这两步过程。 使用 ‐c 选项,生成中间文件*.o
一、编译
g++ ‐c main.cpp ‐o main.o
g++ ‐c other.cpp ‐o other.o
(加上‐c就表示进行的是compile,不是link)
二、链接
g++ main.o other.o ‐o helloworld
(没有加‐c,表示生成最终的可执行程序)
各个cpp编译的顺序无关
查看符号
符号:symbol 指的是函数和全局变量
使用nm命令可以查看中间文件.o和最终程序里的符号
$ nm main.o
U _Z5Otherv
U _Z7Exampleii
U __gxx_personality_v0
00000000
T main (文件里面包含的函数) U printf (外部函数)
观察main.o里的符号…
U: undefined, T: text, Example函数名, ii参数列表
显然,
main.o
main函数(T)
Other函数(U)
Example函数(U)
other.o
Other(T)
Example(T)
所以,把main.o和other.o链接在一起。。。
链接:确保所有的Undefined的符号都有定义
undefined reference错误
在链接时,如果有函数未找到定义,则报告 undefined reference错误。。。
小结
(1)先编译,后链接
(2) 查看符号:nm main.o
(3)在link的时候,所有的符号都必须有定义,(T)
4使用VC编辑器
选择一个高效的编辑器
VC > notepad++ > gedit > vi
演示:使用VC来编辑代码
注意:VC仅充当编辑器的角色,不用来编译