编译和编译选项

1、        动态链接库的编译

Windows下编译动态链接库需要加关键字__declspec,如下:

dll的导入:__declspec(dllimport)

dll的导出:__declspec(dllexport)

 

Linux下编译动态链接库,没有关键字

gcc myfunc.c -shared -o libmyfunc.so

 

2、        动态链接库的加载

Windows

dll的加载:#pragmacomment(lib, dllBaseName)

 

Linux

编译时使用动态链接库,假设libmyfunc.so与main.c在同一级目录。

方式一:gccmain.c  ./libmyfunc.so

方式二:gccmain.c -L. -lmyfunc -Wl,-rpath,./

通过以上两种方法编译的可执行程序可以运行,对于方式二,如果不加上-Wl,-rpath,./也能编译通过,但是执行时会提示找不到动态链接库。如果有多个搜索路径,路径之间以冒号(:)分隔。如:-Wl,-rpath,path1:path2...

 

方式三:在文件/etc/ld.so.conf文件中添加需要搜索的动态链接库路径,然后执行ldconfig命令。

方式四:在环境变量中声明外部变量LD_LIBRARY_PATH,即export LD_LIBRARY_PATH=搜索路径。

 

优先级依次为:

通过-Wl,-rpath,参数指定的搜索路径;

环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

配置文件/etc/ld.so.conf中指定的动态库搜索路径;

默认的动态库搜索路径/lib;

默认的动态库搜索路径/usr/lib;

 

3、        VC中把头文件写在.cpp文件中和写在stdafx.h中的区别

写在stdafx.h中的VC会进行预编译,然后生成pch格式的文件,以后不再对头文件进行编译,除非头文件有改变。适用于标准头文件或者很少修改但却很大的头文件。

 

4、        函数修饰符

_stdcall _cdecl修饰符加在函数返回值和函数名之间。

 

5、        makefile在依赖列表为空或者不存在时的执行

如果目标文件不存在,则不论依赖列表是否为空,依赖列表所示文件是否存在,都执行命令。如果目标文件存在,这个时候有几种情况:

1、依赖列表为空,则不执行命令。

2、依赖列表非空,且依赖列表所示文件不存在,则执行命令

3、依赖列表非空,且依赖列表所示文件已存在,则比较目标文件与依赖文件的新旧,如果前者新,则不执行,如果后者新,则执行。

 

6、        VC的几个常见编译选项

/Od 关闭优化开关

/O1 或 /O2 优化开关,使程序最小或最快

/D "_DEBUG" 相当于#define _DEBUG,打开编译调试代码开关(主要针对assert函数)

/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)

/ZI 创建 Edit andcontinue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译

/Gm 打开最小化重链接开关,减少链接时间

/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改

/GZ 可以帮助捕获内存错误

包括用 0xCC 初始化所有自动变量,0xCD ( Cleared Data ) 初始化堆中分配的内存(即动态分配的内存,例如 new ),0xDD ( Dead Data ) 填充已被释放的堆内存(例如delete ),0xFD( deFencde Data )通过EBP 寄存器保存函数返回地址,函数返回前检查栈指针,确认未被修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值