动态库.so调用实例

代码业务比较复杂这里就不细说,主要记录下动态库的编译以及调用过程:

1. 创建动态链接库

gcc -shared -fPIC paraDocxml.c  -o libmyxml.so

关于 -fPIC 参考这边笔记 http://blog.csdn.net/knight1840/article/details/47206855

可以看到,当前目录下多了一个文件libmyxml.so

接着生成可执行文件:

gcc TestFileOP.c   -lmyxml    -L.   -lxml2   -L /usr/include/libxml2/ -otest

编译链接成功后会生成test在当前目录;

注意其中- l 参数后边跟的是需要链接的库名,-L .告诉编译器在查找库文件的目录

如果没有-l 和-L说明会出现错误:

collect2: ld returned 1 exit status

源文件:

paraDocxml.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libxml/parser.h>
#include "paraDocxml.h"
int paraDocxml(char *str_name,char *str_time,char *str_ver,char *str_md5,char *str_des,char *str_relation,char *str_spcversion)
{

    xmlDocPtr doc;
    xmlNodePtr curNode;
    xmlChar *szKey;
    char *Doctmp="Grade_list.xml";
    doc = xmlReadFile(Doctmp,"utf-8",XML_PARSE_RECOVER);
    if (NULL == doc)
    {
        fprintf(stderr,"Document not parsed successfully.\n");
        return -1;
    }
    curNode = xmlDocGetRootElement(doc);
    if (NULL == curNode)
    {
        fprintf(stderr,"empty document.\n");
        xmlFreeDoc(doc);
        return -1;
    }
    if (xmlStrcmp(curNode->name, BAD_CAST "grade_files"))
    {
        fprintf(stderr,"document of the wrong type, root node != root");
        xmlFreeDoc(doc);
        return -1;
    }
    curNode = curNode->xmlChildrenNode;
    while(curNode != NULL)
    {   printf("%s\n",curNode->name);
        if ((!xmlStrcmp(curNode->name, (const xmlChar *)"grade_file")))
        {
            int ret;
            char *pch;
            szKey = xmlNodeGetContent(curNode);
            sscanf((char *)szKey,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n",str_name,str_time,str_ver,str_md5,str_des,str_relation,str_spcversion);
        }
        curNode = curNode->next;
    }
    return 0;
}

paraDocxml.h

#ifndef _paraDocxml_
#define _paraDocxml_

int paraDocxml(char *str_name,char *str_time,char *str_ver,char *str_md5,char *str_des,char *str_relation,char *str_spcversion);
#endif
~

TestFileOP.h

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "paraDocxml.h"

void getCMDResult(const char *cmd,char *result)

{

char buf_ps[1024];

char ps[1024]={0};

FILE *ptr;

strcpy(ps,cmd);

if((ptr=popen(ps, "r"))!=NULL)

{

while(fgets(buf_ps, 1024, ptr)!=NULL)

{

strcat(result, buf_ps);

if(strlen(result)>1024)

{

break;

}

}

pclose(ptr);

ptr = NULL;

}

else

{

printf("the popen erro ");

}

}

int getCurVersion(char * curVersion)  //get the version 6.0.6 or 6.0.9

{

FILE *fp;

char cmd[] = "ls -l |grep p6_tables";

char result[1024] = {0};

if ((fp=fopen("issuespc.net", "r")) == NULL)

{

printf("file is not exsit!\n");

getCMDResult(cmd,result);

if (strlen(result) > 0 )

strcpy(curVersion,"6.0.9");

}

else

{

strcpy(curVersion,"6.0.6");

}

fp = fopen("issuespc.net","a+");

if (NULL == fp)

return -1;

printf("%s\n",curVersion);

fprintf(fp,"%s\n",curVersion);

}

else

{

if( fgets(curVersion,sizeof(curVersion),fp)!= NULL)

{

printf("curVersuonforissue:%s",curVersion);

printf("get susses!\n");

printf("result:\n%s",result);

printf("curVersuon:\n%s",curVersion);

return 0;

}

}

return 0;

}

int main()

{

char curVersion[256];

char str_name[32]={0},str_time[32]={0},str_ver[32]={0};

char str_des[4000]={0},str_md5[64]={0};

char str_relation[128]={0};

char str_spcversion[32]={0};

getCurVersion(curVersion);

paraDocxml(str_name,str_time,str_ver,str_md5,str_des,str_relation,str_spcversion);

if (strstr(curVersion,str_spcversion)==NULL)

{

printf("The pekage is not match\n");

}

printf("curVersion:%s",curVersion);

return 0;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 08:43:13

动态库.so调用实例的相关文章

VS2010创建动态库和动态库的调用

下面是自己的一些总结,(未完待续): 1.VS2010创建动态库时,与VC差不多,最后都得到的是dll,和lib,还有.h头文件. 2.当一个动态库A调用了另外一个动态库B,并且A是静态调用的(即需要了A的lib,头文件和dll文件),而程序C在使用B动态库时若是静态调用 只需要B的lib,头文件,dll和A的dll即可.-----着说的是静态调用,而动态调用还没搞.

iOS中创建动态库及调用方法

去年因需要用到动态库,自己就找了好多一些 资料,最终找到了一套方法,怎么创建与使用动态库,记录一下: Xcode提供了在iOS工程中创建静态库的功能,和在MAC上创建动态库和静态库的功能. 但是没有提供在iOS工程中创建动态库的功能(苹果官方不允许程序中存在动态库链接,这样的程序会被AppStore拒),如下图:  由于苹果不支持自己创建iOS动态库,所以要想创建动态库首先要修改Xcode的配置文件使其支持具备创建iOS 动态库的功能, 经过调研和查询网上的一些资料,并经过自己测试成功,以下是修

静态库,动态库的调用

在VS中,右击工程名字,选择配置类型,里面有应用程序(.exe),动态库(.dll),静态库(.lib),选择静态库时,在工程目录下,Debug下生成了**.lib,如果要调用**.lib中的函数,只需要将**.lib文件拷贝到目标工作目录之下,然后再程序中加入#pragma comment(lib,"**.lib"),这里的**.lib文件比较大 选择动态库时,在工程目录下,Debug下生成了**.lib和**.dll,如果要调用**.dll中的函数,只需要将**.lib和**.dl

6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

 一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件可以指定父对象 QTimer *timer = QTimer(this);   //这里的this实际上强制转换成为了QObject了. 4  每一个对象都有一个deleteLater()方法, QLineEdit* edit = new QLineEdit(this); delete edit;   //这里的delete马上调用析构函数对内存进行释放

静态库与动态库相互调用

测试场景,Test,lib1,lib2,dll1,dll2,分为下面四种情况: 1.Test->lib1->lib2 lib1编译自己的代码,对lib2的部分,只需要lib2的头文件,对lib2的代码实现,使用占位符关联. 生成Test连接的时候,把lib1的代码实现包含进来,再递归,把lib1中关联lib2的代码实现也包含进来. 运行Test的时候,不再需要lib1和lib2. 2.Test->lib1->dll2 lib1编译自己的代码,对dll2的部分,只需要dll2的头文件

[转]vs2010 静态库以及动态库编译实例

转载地址:http://blog.csdn.net/wswxfwps/article/details/31788703 有网友留言,指出了本文中有错的地方,在此谢谢指摘. 重新编辑了一下本文,新添加了一些东西以及到目前为止对静态库和动态库的心得理解和心得,和大家分享 最近在研究ffmpeg,由于用c#开发,而ffmpeg采用的是c开发,因此打算先用c将ffmpeg的一些函数封装成库,在用c#来调用,花了一天时间(确实水平太低)写了几个vs2010下的静态库以及动态库的编译实例. 一.vs2010

动态调用动态库方法 .so

关于动态调用动态库方法说明 一.       动态库概述 1.  动态库的概念 日常编程中,常有一些函数不需要进行编译或者可以在多个文件中使用(如数据库输入/输 出操作或屏幕控制等标准任务函数).可以事先对这些函数进行编译,然后将它们放置在一些特殊的目标代码文件中,这些目标代码文件就称为库.库文件中的函数 可以通过连接程序与应用程序进行链接,这样就不必在每次开发程序时都对这些通用的函数进行编译了. 动态库是一种在已经编译完毕的程序开始启动运行时,才被加载来调用其中函数的库.其加载方式与静态库截然

linux下动态库的编写和调用

linux下动态库的编写和调用 linux下编写和调用一个简单的动态库大概分为以下几个步骤: - 创建动态库程序文件 add.c int add(int a,int b) { return a+b; } 创建引用头文件 head.c #ifndef _HEAD_ #define _HEAD_ int add(int a,int b); #endif 生成目标文件 生成要加编译器选项 -fpic gcc -fpic -c add.c 然后生成动态库 注意使用链接器选项 -shared gcc -s

VC++6.0 动态库的创建与调用(非MFC的dll)

非MFC动态库的创建... 一个lib.cpp,一个lib.h /*lib.h*/ #ifndef LIB_H #define LIB_H //声明add为dll的导出函数. extern "C" int _declspec(dllexport)add(int x,int y); #endif 也可以加上def文件 ; lib.def : 导出DLL函数 LIBRARY DllTestDef EXPORTS add @ 1 非MFc动态库的调用 1.静态调用 //静态的调用dll动态库