前言:关于动态库与静态库已经显示调用与隐性调用在如下链接有详细解答,本文是动态库创建与隐性调用
1VS平台,在原有解决方案新建工程时,会创建文件夹,所以可以直接新建工程,然后把工程拷贝出来放到原有解决方案的目录下,新建工程的类型在VS2005上会直接影响编译的通过,应按照如下方式创建:
动态库选择DLL,其他代码选择控制台应用程序,不要选择windows程序,因为是用win32编译。
windows可以使用预编译来添加宏定义,在结合条件编译就可以实现对代码的不同环境下的不同执行方式,提高通用性。
2,codelite下的交叉编译
创建工程选择MSVCDLL的动态库项目如图
设置文件的生成路径与名称,这里是交叉编译,linux平台,所以是用/来分隔目录路径
头文件write_ht.h代码如下
#ifndef WRITE_HT//条件编译,防止多次编译文件,该宏一般写成头文件名字的大写便于识别
#define WRITE_HT
#include "xrdk/libxrdk.h"//包含复用库,使用对应的函数和类型,用于跨平台编译
#include "Def.h "
#include <stdio.h>
#include <string.h>
#if defined(EMWRITETEST_EXPORTS)//在预处理中定义宏EMWRITETEST_EXPORTS,触发导出关键字
#define MYAPI xrEXPORT
#else
#define MYAPI xrIMPORT
#endif
extern "C" xrvoid_t MYAPI em_write();//声明导出函数
#endif
源文件如下:
#include "write_ht.h"
#ifdef __unix
#define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename), (mode)))==NULL
#endif//这里的条件编译使得fopen_S函数在Linux下顺利编译
MYAPI xrvoid_t em_write()
{
em_report rpt;
rpt.appid = 0x01;
FILE *fp =NULL;
fopen_s(&fp,"mntlog_a.cime","a");
if(fp==NULL)
{
printf("Ãüþ´ò¿ªÃ§°Ã");
}
else
{
fprintf(fp,"\n%d",rpt.appid);
}
fclose(fp);
}
在调用函数中包含动态库头文件,在设置里设置头文件路径,动态库文件路径和文件名称
注:在工程习惯中,习惯在SRC源码文件夹中存放.h和.cpp的代码文件,然后又会把.h头文件集中存放在一个include文件夹方便调用,此时在创建了工程后,添加头文件和源文件时,源文件从SRC里添加,头文件从include里添加不要从SRC文件夹添加,防止调用函数无法找到头文件(一般主函数都会设置调用include文件夹里的头文件)