精华内容
下载资源
问答
  • 资源为NTDLL的导出API的头文件LIB文件
  • (3)live555的lib头文件和src文件,(存放在 D:\LIVE555\INCLUDE ,D:\LIVE555\LIB 和 D:\LIVE555\SRC中) 二、全局设置 菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入...

    一、环境

    (1)windows xp

    (2)VC6.0

    (3)live555的lib,头文件和src文件,(存放在 D:\LIVE555\INCLUDE ,D:\LIVE555\LIB 和  D:\LIVE555\SRC中)


    二、全局设置

    菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径:

    D:\LIVE555\LIB

    然后选择include files,在下方填入路径:

    D:\LIVE555\INCLUDE

    然后选择source files,在下方填入路径:

    D:\LIVE555\SRC

    点击OK结束


    三、项目设置

    (1)新建一个win32控制台程序。

    (2)拷贝testOnDemandRTSPServer.cpp到当前目录,并添加到项目中。

    (3)每创建一个将要使用live555的VC Project,都需要给它指定需要的lib。菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上


    libUsageEnvironment.lib libliveMedia.lib libgroupsock.lib libBasicUsageEnvironment.lib Ws2_32.lib


    其中Ws2_32.lib是网络套接字的运行库。
    (4)编译链接即可。
    在链接时,可能会报错,如下:
    MSVCRT.lib(MSVCRT.dll) : error LNK2005: _malloc already defined in LIBCD.lib(dbgheap.obj)等
    如果在程序中同时使用了多个函数库,并且这些函数库中有些函数名称有冲突,就会引起LNK2005错误。微软提供了两套C运行期函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个LNK2005错误,一般情况下它需要MFC的库先于普通运行期函数库被连接,因此建议使用支持多线程的msvcrt.lib。
    产生的原因是一个函数在两个不同的Lib中都有导出(MSVCRTD和LIBC有冲突),有两种办法处理:
    方法一: MSDN对此的解决方法是增加[/FORCE:MULTIPLE]连接选项. 这方式发现会有警告,但可以编译通过:
    LINK : warning LNK4075: ignoring /INCREMENTAL due to /FORCE specification
    MSVCRT.lib(MSVCRT.dll) : warning LNK4006: _malloc already defined in LIBCD.lib(dbgheap.obj); second definition ignored


    方法二:添加链接选项:/NODEFAULTLIB:<library> 如:/nodefaultlib:"libcd.lib"  该方法能编译通过,并且没有警告


    
    
    
    
    
    
    展开全文
  • DLL导出lib文件和.h头文件

    万次阅读 2012-06-18 14:16:50
    还有不少dll导出的都是类,直接显式调用不太方便,最后综合网上的办法,自己再写两个工具,终于实现了将dll导出lib文件,并同时生成.h头文件。    还是自己动手才能丰衣足食啊。 ===========================...

       最近工作中遇到需要调用别人的动态链接库,但是只有个dll文件,别的一概没有,这可怎么办呢。还有不少dll导出的都是类,直接显式调用不太方便,最后综合网上的办法,自己再写两个工具,终于实现了将dll导出lib文件,并同时生成.h头文件。
        
        还是自己动手才能丰衣足食啊。

    =========================================================================

    问题:如果手上只有一个DLL文件,没有lib文件.h头文件,程序里怎么调用它

    方法当然很简单,
    先用VC的工具Depends.exe查看导出函数的函数名啊
    用IDAPro或者其他反汇编工具分析函数原型
    再用API函数:LoadLibrary,GetProcAddress
    完成!

    但是……如果Dll导出的是一个个的类呢,这就稍微有点麻烦

    ========================================================================

    方法1:还是用显式调用,LoadLibrary,GetProcAddress,
    这时候就要在头文件里声明一个个的“类成员函数的函数指针”了,
    把GetProcAddress返回值赋给这些指针,使用时调用指针即可。

    如何知道类的成员函数原型是长什么样的呢?
    还是Depends工具,如果直接看,会发现导出函数名中有好多"?","@"等符号,

    Depends的上面有个按钮"C++"(如果没有这个按钮,说明你的Depends太老了,下载个新的吧),点了这个按钮,再看看函数名有啥变化,是不是变得比较好理解了
    不过Depends解析得还不够完全,看不出来成员函数是public、protected还是private,也不知道调用约定是__cdecl、__stdcall还是__fastcall,是虚函数还是静态成员函数。
    如果要知道这些,还是用VC的undname.exe看得比较全面。

    =======================================================================

    方法2:用lib文件进行隐式链接,这样无需LoadLibrary,个人感觉比较方便的
    如何生成lib文件呢,假设动态链接库名为example.dll,步骤如下

    1、执行dumpbin.exe/EXPORTS example.dll>example.def
    生成了一个def文件,里面的内容大概是下面这样:
       ordinal hint RVA      name
           1    0 00004570?function1@@
           2    1 00004540?function2@@

    2、编辑这个def文件,删掉没用的信息,将它整理成这样的格式 :
            LIBRARY "example"
            EXPORTS
            ?function1@@    @1
            ?function2@@    @2
    上面的@1和@2是根据第1个步骤中的ordinal序号来的

    这个步骤我写了个程序HandleDef.exe来自动修改,否则太多函数的话手动改就累死了

    3、运行lib.exe/def:example.def
    生成了example.lib和example.exp文件。这个lib文件就可以在VC里用了,
    比如这样    #pragma comment(lib,"example.lib")

    4、新建一个文件example.tmp,里面保存函数名
    ?function1@@
    ?function2@@
    然后运行undname.exeexample.tmp>example.txt
    这样函数名就解析到example.txt文件里了

    5、自己写了个HandleTxt.exe程序,把example.txt转换为example.h
    转换后变成类似下面这样:

    1.       class __declspec(dllimport) CExample  

    2.       {  

    3.       public: int function1(void);  

    4.       public: void function2(char);  

    5.       };  

    这个样子的基本就能直接拷到VC里用了。
    不过,如果自己的程序要用到构造函数来新建一个对象的话,对导入类进行声明的时候要事先分析好类对象的内存分布(这可不是个简单的事啊),上面这个CExample类应该这样声明

    1.       class __declspec(dllimport) CExample  

    2.       {  

    3.       public: int function1(void);  

    4.       public: void function2(char);  

    5.       public: BYTE m_data[256];  

    6.       };  

    //上面m_data具体多少个字节,要靠自己反汇编分析,没法自动生成,具体方法比较麻烦,有兴趣的可以去网上查一些C++类的反汇编资料。

    ==========================================
    总结:
    为了方便,把以下内容写到一个批处理文件中
    set name=example

    dumpbin.exe/EXPORTS %name%.dll>%name%.def
    HandleDef.exe %name%.def
    lib.exe /def:%name%.def /MACHINE:IX86
    undname.exe %name%.tmp>%name%.txt
    HandleTxt.exe %name%.txt

    执行完之后生成lib文件和h文件。
    =========================================

    上面提到的HandleDef.exe和HandleTxt.exe是我自己用C#写的小程序。

    写了这么多,也不知道有没有人会感兴趣。

    注:我这个还只是适用于VC编写的dll导出的类

    如果用extern"c"导出的函数,除了自己反汇编分析原型,貌似没有别的办法

    如何调用非VC编译器编译出来的类,暂时未研究过。


     

    下载地址:http://pan.baidu.com/netdisk/singlepublic?fid=795627_2574562052

     

    展开全文
  • Linux下通过lib导出

    千次阅读 2011-08-19 15:34:56
    在linux下面如果想要导出一个类,可以通过虚拟继承一个基类,通过基类的指针来访问导出的类。...头文件的定义,通过函数Getpmmethod来导出该类。 #ifndef _PMMETHOD_H_ #define _PMMETHOD_H class pm

    在linux下面如果想要导出一个类,可以通过虚拟继承一个基类,通过基类的指针来访问导出的类。

    代码如下:

    头文件的定义,通过函数Getpmmethod来导出该类。

    #ifndef _PMMETHOD_H_
    #define _PMMETHOD_H

    class pmth
    {
        public:
            //pmth(int a,int b)=0;
            //pmth(){};
            virtual ~pmth(){};
            virtual int plus()=0;
            virtual int minor()=0;
            virtual int mutiply()=0;
            virtual int divide()=0;
    };

    class pmmethod:virtual public pmth
    {
        public:
            pmmethod(int a,int b);
            ~pmmethod();
           virtual int plus();
           virtual int minor();
           virtual int mutiply();
           virtual int divide();
            void print();
        private:
            int m_a;
            int m_b;
    };
    extern "C" pmth * Getpmmethod(int a, int b);
    #endif

    类的实现部分:

    #include "pmmethod.h"
    #include <stdio.h>
    pmth* Getpmmethod(int a,int b)
    {
        printf("Getpmmethod()\n");
        return (new pmmethod(a,b));
    }

    pmmethod::pmmethod(int a,int b)
    {
        m_a = a;
        m_b = b;
    }
    pmmethod::~pmmethod()
    {}

    void pmmethod::print()
    {
        printf("m_a =%d,m_b = %d\n",m_a,m_b);
    }
    int pmmethod::plus()
    {
        print();
        return m_a+m_b;
    }

    int pmmethod::minor()
    {
        return m_a-m_b;
    }

    int pmmethod::mutiply()
    {
        return m_a*m_b;
    }

    int pmmethod::divide()
    {
        if(m_b != 0 )
        {
            return (m_a/m_b);
        }
        printf("the divider is zero!\n");
                                            
    }

    执行代码调用类的实现部分。

    #include <dlfcn.h>
    #include <stdio.h>
    #include "pmmethod.h"
    #include <stdint.h>
     pmth* (*getpmmethod)(int,int);

    int main()
    {
        void *dlh = dlopen("libpm.so",RTLD_LAZY);

        const char *dlError = dlerror();
        if(dlError)
        {   
            printf("dlopen error %s!\n",dlError);
        }   
        getpmmethod = (pmth*(*)(int,int))(uintptr_t)dlsym(dlh,"Getpmmethod");

        pmth * pm = getpmmethod(4,2);
        printf("plus = %d\n",pm->plus());
        printf("minor = %d\n",pm->minor());
        printf("mutiply = %d\n",pm->mutiply());
        printf("divide = %d\n",pm->divide());
        delete pm;

        dlclose(dlh);
    }

    通过这种方式就可以导出这个类。


    展开全文
  • 一、创建静态的lib或者动态的dll 1、头文件:data.h class _declspec(dllexport) DATA {  public:  int get();  void set(int data);  private:  int m_data; };   2、源文件:data.cpp #include ...

    一、创建静态的lib或者动态的dll

    1、头文件:data.h

    class _declspec(dllexport) DATA
    {
     public:
      int get();
      void set(int data);

     private:
      int m_data;
    };

     

    2、源文件:data.cpp

    #include "data.h"

    inline int DATA::get()
    {
     return m_data;
    };

    inline void DATA::set(int data)
    {
     m_data = data;
    };

     

    若是创建静态lib,则最后有用的是data.lib;若是创建动态的dll,则最后有用的是data.dll和data.lib

     

    二、调用dll或者lib的主程序(与函数不同的是,必须是包含头文件的方式,而不能用class _declspec(dllimport) DATA;)

    #include "data.h"
    #include <iostream>
    using namespace std;

    #pragma comment(lib,".\\debug\\DATA.lib")


    int main()
    {
     DATA data;
     int nData;
     data.set(10);
     nData = data.get();
     cout<<nData<<endl;
     getchar();
     return 0;
    }

    调用lib则需要把data.lib放在.\\debug\\DATA.lib下,代码有变动需要重新编译主程序;若是调用的dll,则需要把link的lib放到.\\debug\\DATA.lib下,还需要把data.dll放到与exe同样的目录下,dll的代码有变动,若只是类的函数体变动,而接口没有变动,则不需要编译主程序,只需要替换data.dll供主程序调用。

    展开全文
  • 一、动态库大体使用过程: (1)DLL中导出类、函数、对象 ... 在项目中添加一个Test.h头文件,该文件的内容如下:  //导出类  class __declspec(dllexport) CTest  {  ...  };  //导出函数  __declspec(dl
  • 普通dll导出lib

    千次阅读 2017-12-22 11:53:37
    李国帅 编辑于2006-5-18 14:57有时候,我们使用别人的开发包,只有动态库而没有头文件,希望看到所使用的动态库dll有那些函数,方便二次开发,那么我们就需要借助工具进行转换。过程说明In order to use this pre-...
  • 项目属性-配置属性-c/c++-将wchar视...就把第3方lib提供的头文件里不能解析的函数的参数内的wchar改成 unsigned short。 C++, my almost favorite language. This language had good intentions, really. But this is
  • 目标,生成springboot项目能引用的.so文件 新建一个类,注意包名 ...public class NativeLib { static { System.loadLibrary("NativeLib"); } public static void main(String[] args) { ...
  • gcc按照如下顺序寻找头文件 1. 首先到 -I 选项指定的目录寻找 2. C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH这些环境变量指定的路径寻找 3. standard system directories,这写路径包括: /usr/...
  • 头文件lib 和 dll 三者的作用和联系 ① 头文件的作用:声明函数接口 ② lib 库有两种, 静态链接库(Static Library),索引和实现都在其中 动态链接库的导入库,此时 lib 只是一些索引信息,记录了 dll 中函数的...
  • dll导出def和lib文件

    千次阅读 2018-08-16 15:46:11
    在Windows下编程的同学,可能都知道可以使用Depends这个工具查看dll依赖项和导出符号, 却很少知道在命令行下,由两个更好用的命令,分别是dumpbin和lib,这是VS安装目录下的两个程序。 dumpbin 用法: ...
  • .h头文件 .lib动态链接库文件 .dll 动态链接库 .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件。如果要完成源代码的编译和...
  • (1).h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib 不是.dll 若生成了DLL ,则肯定也生成 LIB文件 如果要完成源代码的编译和链接,有头文件lib就够了。 如果也使动态...
  • 如何DLL文件导出对应的LIB文件

    千次阅读 2014-11-19 14:55:44
    如何DLL文件导出对应的LIB文件 分类: 框架与平台2013-10-07 17:00 651人阅读 评论(0) 收藏 举报 在Windows平台上使用MSYS编译一些开源代码时经常只会生成DLL文件,而如果打算在VS中使用该DLL则需要有...
  • 很奇怪的问题,我写了一个测试程序,用makefile进行编译,但如果我在头文件里声明了新的函数,在.cpp文件中定义这个函数,make时会提示我----错误:成员函数‘int mysql_soci_test::sum()’未在类‘mysql_soci_...
  • c++mfc头文件库文件动态库 目录(?...如果要完成源代码的编译和链接,有头文件lib就够了。如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。 .h .lib .d
  • 由dll导出lib文件

    千次阅读 2017-01-16 11:48:30
     只有dll文件(my.test.dll)和头文件,没有lib文件,需要导出lib,静态编译进代码中,用VS自带的dumpbin.exe和lib.exe来完成。  dumpbin.exe和lib.exe的路径不赘述,路径见下图:    先用如下命令行导出dll的...
  • h头文件 .lib库文件 .dll动态链接库文件关系  .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件。如果要完成源代码的编译和链接...
  • // 下列 ifdef 块是创建使 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLLTEST_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含...
  • h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。   附加依赖项的是.lib不是.dll,若生成了dll,则肯定也生成lib文件。如果要完成源代码的编译和链接,有头文件lib就够了。如果要使需要动态连接...
  • #pragma comment(lib,"Project1.lib") int main() { int a = Add(12, 5); printf("%d", a); getchar(); return 0; } 编译,运行成功 导出类的定义 ,其实就是导出类的成员函数 MyObject.h #...
  • (1).h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。 附加依赖项的是.lib 不是.dll 若生成了DLL ,则肯定也生成 LIB文件 如果要完成源代码的编译和链接,有头文件lib就够了。 如果也使...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,070
精华内容 7,628
关键字:

从lib导出头文件