相对路径:./
:当前目录, ../
:上一级目录
绝对路径
(1)完整的命令格式
命令(空格)[选项](空格)[操作对象]
(2)常用操作命令
pwd
:打印当前工作目录;
ls
:列出当前工作目录下所有文件/文件夹名称;
cd
:切换当前工作目录;
mkdir
:创建目录;
touch
:创建新文件,如 touch myfile.txt
rm
:删除文件/文件夹,且不可恢复,慎用;
# 删除当前路径下的 file 文件
rm file.txt
# 删除绝对路径下的 file 文件
rm /home/file.txt
# 删除当前路径下所有文件/文件夹
rm -rf myfolder
# 删除绝对路径下所有文件/文件夹
rm -rf /home/myfolder
cp
:复制文件/文件夹到指定位置
mv
:移动文件到新的位置,或者重命名文件
实际使用中:
使用 gcc 编译 c 代码
使用 g++ 编译 c++ 代码
# -E 表示编译器仅对输入文件进行
g++ -E test.cpp -o test .i
注意:-o
表示输出 out,也就是 .cpp
输出为 .i
。
# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编文件后停止编译
# g++ 产生的汇编语言文件的缺省扩展名为 .s
g++ -S test.i -o test.s
# -C 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
# 缺省的扩展名为 -o
g++ -C test.s -o test.o
# 生成可执行文件 .bin 文件
g++ test.o -o test
g++ test.cpp -o test
./test
(1)-g
编译带调试信息的可执行文件
g++ -g test.cpp -o test
(2)-O[n]
优化源代码,可以提高源代码的运行效率。
-O0 表示不作优化
-O1 作默认优化
-O2 除了完成 -O1 的优化外,还进行一些额外的调整工作
-O3 进一步优化
g++ -O2 test.cpp -o test
(3)-l
和 -L
:分别指定库文件和库文件路径
(4)-I
指定头文件搜索目录
(5)-std=c++11
:设定编译标准
(6)-o
:指定输出文件名
g++ test.cpp -o test01
假设有如下工作目录:
.
|——include
| |___Swap.h
|——main.cpp
|——src
| |___Swap.cpp
执行命令
g++ main.cpp src/Swap.cpp -Iinclude -o main
./main
-I
后面是头文件目录
也可添加其他编译选项。
库 就是一段编译好的二进制文件。
1、链接 静态库 生成可执行文件
# 进入 src 目录下
cd src
# 汇编,生成 .o 文件
g++ Swap.cpp -C -I../include // -C 表示汇编生成 Swap.o 文件
# 生成静态库 libSwap.a
ar rs libSwap.a Swap.o
# 回到上级目录
cd ..
# 链接静态库并执行
g++ main.cpp -lSwap -Lsrc -o static_main
./static_mian
2、链接 动态库 生成可执行文件
# 进入 src 目录下
cd src
# 生成动态库 libSwap.so
g++ Swap.cpp -I../include -fPIC -shared -o libSwap.so
// -shared 表示生成动态库
# 回到上级目录
cd ..
# 链接动态库并执行
g++ mian.cpp -Iinlude -lSwap -Lsrc -o dyna_mian
LD_LIBRARY_PATH = src ./dyna_main
注意执行文件时的区别:静态库的代码在编译的过程中已经载入到可执行文件中,故直接运行即可;而动态库是分开的,只保留接口,需要调用,不在同一目录下时,需添加路径。所以,静态库也会比较大。
Windows 中静态库扩展名为 .lib
,动态库扩展名为 .dll
。
(1)基本语法格式:指令(参数1 参数2)
中间用空格或分号隔开。
(2)指令和大小写无关,参数和变量是大小写相关的。
(1)cmake_mininum_required
:指定 CMake 最小版本要求
cmake_mininum_required(VERSION 2.8.3)
(2)project
:定义工程名称,并可指定工程支持的语言
project(HELLOWORLD)
(3)set
:显式的定义变量
# 定义变量 SRC,其值为 hello.cpp、sayhello.cpp
set(SRC hello.cpp sayhello.cpp)
(4)include_directories
:向工程添加多个特定的头文件搜索路径,相当于指定 g++ 编译器的 -I 参数。
include_directories(/home/include)
(5)link_directories
:向工程添加多个特定的库文件搜索路径,相当于指定 g++ 编译器的 -L 参数。
link_directories(dir1 dir2)
# 绝对路径、相对路径均可
link_directories(/home/myfolder ./lib)
(6)add_library
:生成静态库/动态库文件
通过变量 SRC 生成libhello.so 共享库
add_library(hello SHARED ${SRC})
这里的 SRC
就是前面定义的变量。
(7)add_compile_options
:添加编译参数
# 添加编译参数 -wall -std=c++11 -O2
add_compile_options(-wall -std=c++11 -O2)
(8)add_executable
:生成可执行文件
# 编译 main.cpp 生成可执行文件 main
add_executable(main main.cpp)
(9)target_link_libraries
:为 target
添加需要链接的共享库,相当于指定 g++ 编译器的 -l 参数
# 将 hello 动态库文件链接到可执行文件 main
target_link_libraries(main hello)
(10)add_subdirectory
:向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放点的位置
# 添加 src 子目录,src 中需要有一个 CMakeLists.txt
add_subdirectory(src)
(11)aux_source_directory
:发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
# 定义 SRC 变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)
# 编译,并生成 main 可执行文件
add_executale(main ${SRC})
编译过程:
写 CMakeLists.txt 文件
生成 Makefile 文件
执行命令 make 进行编译
1、最小 CMake 工程
2、多文件 CMake 编译
假设有如下工作目录:
.
|——include
| |___Swap.h
|——main.cpp
|——src
| |___Swap.cpp
CMakeLists.txt 文件为
cmake_mininum_required(VIRSION 3.10)
project(SWAP)
add_directories(include)
add_executable(main main.cpp src/Swap.cpp )
外部构建(这样文件夹更整洁),终端中输入
mkdir build
cd build
cmake ..
make
./main
当然,上面也等价于
g++ main.cpp src/Swap.cpp -Iinclude -o main
./main
.
|——build
|——include
| |___...
|——src
| |___...
|——main.cpp
|——CMakeLists.txt