C语言开发外围
文章目录
gcc
一,常用选项
#调试信息
-g 以默认格式生成调试信息。
#错误
-Wall 打开大部分警告信息
-Wextra 打印额外的(可能不需要的)警告。
-Wunused 启用所有- wunused - warnings。未使用变量,可以有效优化程序
-Wpedantic 发出严格遵守标准所需的警告。
-Wshadow 当一个变量遮蔽另一个变量时发出警告。
-Werror 把所有的警告都当作错误对待。
#优化
-O<number> 设置优化等级 <number>.
0默认 不优化
1
2发布版本
3可能会出问题
-Ofast 优化速度不考虑具体的标准遵从性。
-Og 优化调试经验,而不是速度或规模。
-Os 优化空间而不是速度。
#必用
-o <file> 将输出放到<file>.
-fPIC 如果可能,生成与位置无关的代码(大模式)。
-fPIE 如果可能的话,为可执行程序生成位置无关的代码(大模式)。
-std=<standard> 设置语言标准。
-E 进行预处理;
-S 编译;
-c 编译和组装,但不链接。
-o <file> 将输出放入<file>中。
-shared 创建共享库。
-version 展示编译器版本
-Lxxx 指定库文件夹
-lxxx 指定单个库
-Ixxx 指定头文件目录
-ixxx 指定单个头文件
-DXXX=xxx 指定XXX宏的值为xxx
二,常用组合
1.编译为目标文件
gcc [其他选项] -c [-o xxx.o] xxx.c
2.创建动态库
gcc [其他选项] -shared -fPIC -o libxxx.so 目标文件/源文件
3.创建静态库
#第一步
gcc [其他选项] -c xxx.o
#第二步
ar -crv libxxx.a xxx1.o xxx2.o ...
4.创建可执行文件
gcc [其他选项] -o exe 目标文件/源文件
三,环境变量
不想每次编译的时候都要写头文件目录,库目录在gcc命令后面,或者开发时使用vim搭配clangd的时候即不想写配置文件,还想可以自动补全。可以将头文件目录和库文件目录放到环境变量中即可。
export C_INCLUDE_PATH=/xxx/xxx/include:$C_INCLUDE_PATH;
export CPLUS_INCLUDE_PATH=/xxx/xxx/include:$CPLUS_INCLUDE_PATH;
export LIBRARY_PATH=/xxx/xxx/lib:$LIBRARY_PATH;
当你运行程序的时候,可能找不到库,需要以下方法,让你的程序可以找到你的库。
1.添加环境变量
export LD_LIBRARY_PATH=/xxx/xxx/lib:$LD_LIBRARY_PATH;
2.放在系统加载配置文件中
打开/etc/ld.so.conf将/xxx/xxx/lib添加到下面即可
make
大概的语法
makefile的全部语法复杂又不好理解,所以这里只是足够工作的知识,如果可以的话可以自己写一个.
targetfile:a.o b.o c.o // 期待文件:所需文件 只要有所需文件就会自动执行
gcc -o targetfile a.o b.o c.o //<tab>命令1
// 命令2
// 长命\
// 令
cmdbyhand: //如果没有所需文件,那么冒号前的就是个命令名
@echo "手动处理" //而不是期待文件 如 make cmdbyhand
cmdbyauto:
command1
command2
.PHONY:cmdbyauto //添加到.PHONY:之后的命令 就会自动执行
var=a.o b.o c.o //定义变量
targetfile:$(var) //使用变量
gcc -o targetfile $(var)
gdb
常用命令
file 文件名 载入某可执行文件
break n 在n行打断点
info 查看和可执行程序相关的各种信息
kill 终止正在调试的程序
print 显示变量或表达式的值
set args 设置调试程序的运行参数
delete 删除某个断点或观测点
clear n 删除指定行的断点
continue 从断点出继续执行
list 列出GDB中可加载的程序代码
watch 在程序中设置观测点
run 运行GDB中可加载的程序
next 单步执行程序
step 进入所调用函数的内部,查看执行情况
whatis 查看变量或函数类型
ptype 显示数据结构定义情况
make 编译程序
与c++交互
有很多有用的库都是用c++写的,那为什么不直接用c++?,c++是一个非常复杂的语言,没办法精通,而且与其他语言交互的时候还是用的c语言接口。
一,步骤
1.将要用的c++代码编译为库;
2.创建一个中间层,将c++特性转换为函数,并将中间层编译为库;
3.在c语言中调用中间层函数,从而达到调用c++的目的.
二,实现
1.中间层头文件
middle.h
#ifndef _MIDDLE_H
#define _MIDDLE_H
#ifdef __cplusplus
extern "C" {
#endif
//导出函数名1
//导出函数名2
//...
#ifdef __cplusplus
};
#endif
#endif
2.中间层实现文件
middle.c/middle.cpp
#include "某c++头文件"
#include "middle.h"
#ifdef __cplusplus
extern "C" {
#endif
//导出函数1{
//用c++实现
//}
//导出函数2{
//用c++实现
//}
//...
#ifdef __cplusplus
};
#endif
3.编译中间层
g++ [其他选项] -shared -fPIC -o libmiddle.so middle.c
//要用g++编译,因为实现代码是c++代码
4.使用
main.c
#include "middle.h"
int main(){
//导出函数1
//导出函数2
//导出函数3
}
三.c++调用c语言
同上,只不过实现代码是c,编译器也要是gcc