C语言开发外围

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值