~/test
|
|
|------main.c
|------lib
| |
| |------StringLen.h
| |------Strlen.c
| |------Strnlen.c
----------------StringLen.h:
#ifndef _STRINGLEN_H__
#define _STRINGLEN_H__
int Strlen(char *pStr);
int StrNlen(char *pStr, unsigned long ulMaxLen);
#endif
-------------------------------------------------
---------------Strlen.c:
#include<stdio.h>
#include<assert.h>
#include "StringLen.h"
int Strlen(char *pStr)
{
unsigned long ulLength;
assert(NULL != pStr);
ulLength = 0;
while(*pStr++)
{
ulLength++;
}
return ulLength;
}
-------------------------------------------------
---------------Strnlen.c:
#include<stdio.h>
#include<assert.h>
#include "StringLen.h"
int StrNlen(char *pStr, unsigned long ulMaxLen)
{
unsigned long ulLength;
assert(NULL != pStr);
if(ulMaxLen <= 0)
{
printf("Wrong Max Length!/n");
return -1;
}
ulLength = 0;
while(*pStr++ && ulLength < ulMaxLen)
{
ulLength++;
}
return ulLength;
}
-------------------------------------------------
生成动态库:
gcc -fpic -shared -o libStrlen.so Strlen.c
gcc -fpic -shared -o libStrnlen.so Strnlen.c
(生成动态库后,可以将Strlen.c Strnlen.c删除掉)
-----------------------main.c:
#include<stdio.h>
#include<dlfcn.h>
#include "StringLen.h"//静态库对应函数的头文件
int main(int argc, char* argv[])
{
void *pHandle;
int (*pFunc)(char*); /* 指向函数的指针 */
char str[] = {"hello world"};
unsigned long ulLength = 0;
pHandle = dlopen("./lib/libstr.so", RTLD_NOW); /* 打开动态库*/
if (!pHandle)
{
printf("Cann't find Strlen.so/n");
return -1;
}
pFunc = (int(*)(char*)) dlsym(pHandle, "Strlen"); /* 获取库函数地址 */
if (pFunc) /* 获取库函数对象成功,执行库函数 */
{
ulLength = pFunc(str);
//cout<<ulLength<<endl;
printf("Strlen:%lu/n",ulLength);
}
else /* 获取库函数对象失败,提示之 */
{
printf("Cann't find func Strlen/n");
}
dlclose(pHandle); /* 关闭动态库 */
return 0;
}
-------------------------------------------------------
//编译main.c
gcc -Wall -I....../test/lib -L...../test/lib -o test1 main.c -ldl (在指定路径时,相对路径和绝对路径都可以)