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 寄存器保存函数返回地址,函数返回前检查栈指针,确认未被修改。