linux c
1.编写pr.c
int p = 1;
void sayHello(){
printf("pr sayHello ... \n");
}
2.编写main.c
/*
* File: main.c
* Author: Vicky.H
*
* Created on 2011年9月19日, 下午1:36
*/
#include <stdio.h>
#include <stdlib.h>
/*
*
*/
int main(int argc, char** argv) {
sayHello();
return (EXIT_SUCCESS);
}
3.运行
gcc -O -fpic -shared -o dl.so pr.c 生成动态链接库
gcc -o main main.c ./dl.so 编译main.c 引用动态链接库
./main
>>pr sayHello ...
当动态库的位置或名称发生改变时,程序将无法正常执行;而动态库取代静态库的好处之一则是通过更新动态库而随时升级库的内容!
4 .动态库的显示调用
编写如main2.c的程序
/*
* File: main2.c
* Author: Vicky.H
*
* Created on 2011年9月19日, 下午1:43
* 目的:动态库的显示调用
*/
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
/*
*
*/
int main(int argc, char** argv) {
void *pHandle;
void (*pFunc)(); // 指向函数的指针
int *p;
pHandle = dlopen("./dl.so",RTLD_NOW); // 打开动态库
if (!pHandle) {
printf("can not found dl.so\n");
return (EXIT_SUCCESS);
}
pFunc = (void(*)())dlsym(pHandle,"sayHello"); // 获得动态库中的函数sayHello地址
if (pFunc) {
pFunc();
} else {
printf("can not found function ");
return (EXIT_SUCCESS);
}
p = (int *)dlsym(pHandle,"p"); // 获得动态函数库变量p的地址
if (p) {
printf("p = %d\n",*p);
} else {
printf("can not found p !\n");
}
dlclose(pHandle); // 关闭动态链接库
return (EXIT_SUCCESS);
}
5.运行
gcc -o main2 main2.c -ldl
./main2
>>pr sayHello ...
>>p = 1
---------------------------------------------------------------------------------------------------------
vc
1.编写dll_dynamic.h头文件
#ifndef DLL_DYNAMIC_H
#define DLL_DYNAMIC_H
extern "C" int __declspec(dllexport)add(int x,int y);
#endif
2.编写dll_dynamic.cpp
// dll_dynamic.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "dll_dynamic.h"
int add(int x,int y) {
return x + y;
}
3.右键->生成 dll_dynamic.dll
4.编写dll_dynamic_test.cpp 测试动态链接库
// dll_dynamic_test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
typedef int (*lpAddFunc)(int,int);
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDll;
lpAddFunc addFunc;
// 错误 8 error C2664: “LoadLibraryW”: 不能将参数 1 从“const char *”转换为“LPCWSTR”
// 解决:工程属性->配置属性-->常规--->字符集---->使用多字节符字符集
hDll = LoadLibrary("..\\Debug\\dll_dynamic.dll");
if (hDll != NULL)
{
addFunc = (lpAddFunc) GetProcAddress(hDll,"add");
int sum = addFunc(3,4);
cout << "sum = " << sum << endl;
}
getchar();
return 0;
}
5.运行 sum = 7