1.静态库工程:
  Question1:
此类工程最终生成.lib 文件,若要在其他工程应用此 lib,
  需要把lib文件加到工程的链接文件列表中,并且对所要用到的函数、类等要使用lib提供的头文件,
  此时lib文件有点类似于.obj文件。对于lib中提供给外界使用的函数等在申明的时候需不需要特殊
  的修饰符号,如类似动态库中的__declspec(dllexport)等。  Question2:
Linux/UNIX中此种静态库的对应格式是什么,怎样生成。2.动态库工程:
  (1)函数“暴露”方法:
a:通过__declspec(dllexport)来表明此函数外界可以使用;
b.通过定义.def文件来说明函数外显;
Question3:
    它们是不是完全等价的(不管别人怎么使用,只要用其中的一种,别人就可以使用),
或者是不同的用法对应于相应的定义方法?   (2)dll内函数使用方法:
a: 直接在程序运行的时候调用LoadLibrary,GetProcAddress等来调用程序;
b:(Question4): 就像调用本工程定义的函数一样调用dll提供的函数,此时怎样在工程导入dll信息
  (就是此种情况应该怎样应用dll),对于被调用的函数有什么特殊要求吗,
 __declspec(dllimport) 怎样使用? Question5:生成dll的时候也会生成lib文件此时 lib文件有什么用,和上面的lib文件有什么区别。
        Question6:
UNIX/Linux种对应动态库怎样使用。        (Optional):提供每种库、库使用方法的示例工程。        

解决方案 »

  1.   

    1 客户程序需要针头文件,进行导入添加的关键字就是:_declspec(dllimport),如:
    _declspec(dllimport) int MyFunction(int);
    extern "C" _declspec(dllimport) int MyFunction(int);
    2 不熟悉Linux/UNIX
    3 使用__declspec(dllexport)就需要使用_declspec(dllimport),而def文件不必更多信息参考:
    http://blog.csdn.net/laiyiling/archive/2004/12/10/211713.aspx
    下面的CHM文件是整理的关于DLL的资料:
    http://218.108.41.12/vchome/book/mydownload/vchome_dll.chm
      

  2.   

    linux 中好像叫作 elf 格式
      

  3.   

    5,这个lib中含有函数的地址等一些信息,具体函数调用还是要看dll
      

  4.   

    在生成动态库的时候,VC7下默认生成了 .dll,.lib,.exp文件,这些文件分别在什么情况下用,要静态加载dll(程序运行的时候自动加载dll,而不是通过LoadLibrary,getProcAddress,调用dll中的函数就像调用本地函数一样)该怎么用。
      

  5.   

    linux / unix
    下的gcc 动态库的用法:
    EX:
    /* s1.c  */
    #include <stdio.h>    
    int test()            
    {                     
      return 100;         
    }                     
    /* s2.c */  
    #include <stdio.h>          
    extern int test();          
    main()                      
    {                           
       printf("n=%d\n",test()); 
    }                           
    ------------------------------
    s1 的编译:
    gcc -shared -o s1.so s1.c  // 生成s1.so 的动态库
    s2 的编译
    gcc -o s2 s2.c s1.so
    运行时,必须把s1.so拷入/usr/lib ,2 才能正常运行   
      

  6.   

    静态加载dll
    把h文件加入工程,lib库加入module 
    把lib,dll文件拷贝到工程目录下Debug或Release下
      

  7.   

    1.静态库工程:
      Question1:
    此类工程最终生成.lib 文件,若要在其他工程应用此 lib,
      需要把lib文件加到工程的链接文件列表中,并且对所要用到的函数、类等要使用lib提供的头文件,
      此时lib文件有点类似于.obj文件。对于lib中提供给外界使用的函数等在申明的时候需要特殊
      的修饰符号,如__declspec(dllexport)或WINAPI。
    2.动态库工程:
      (1)函数“暴露”方法:
    a:通过__declspec(dllexport)来表明此函数外界可以使用;
    b.通过定义.def文件来说明函数外显;
    Question3:
        是等价的(不管别人怎么使用,只要用其中的一种,别人就可以使用)   (2)dll内函数使用方法:
    a: 直接在程序运行的时候调用LoadLibrary,GetProcAddress等来调用程序;
    b:(Question4): 就像调用本工程定义的函数一样调用dll提供的函数,在工程导入dll信息
      #import "DllPath\\xxx.lib"
    Question5:生成dll的时候也会生成lib文件此时的lib文件和前面提到的lib是一回事。
      

  8.   

    我用的是VC7,现在通过 #pragma  comment(lib,"dllname.lib")
    extern "C" __declspec(dllimport) return_value funName(arglist);
    的方法能够成功连接,运行了。但是在VC7中和VC6的"把h文件加入工程,lib库加入module "对应操作是什么啊?
    另外我想 动态库的 lib文件和静态库的lib文件应该是不同的吧。
      

  9.   

    1.静态库工程:
      Question1:
    不需要__declspec(dllexport),就像在OBJ文件一样。  Question2:
    对应的是xxxLib.o2.动态库工程:
      (1)函数“暴露”方法:
    a:通过__declspec(dllexport)来表明此函数外界可以使用;
    b.通过定义.def文件来说明函数外显;
    Question3:
        完全等价的!
       (2)dll内函数使用方法:
    a: 直接在程序运行的时候调用LoadLibrary,GetProcAddress等来调用程序;
    b:(Question4): 就像调用本工程定义的函数一样调用dll提供的函数,此时怎样在工程导入dll信息
      在vckbase.com找个调用例子就知道了,不需要导入什么东西。
    Question5:这个LIB只是一些DLL的信息,不是真的静态库
            Question6:
    。        http://www.vckbase.com
      

  10.   

    1.静态库工程:  Question2:
    Linux/UNIX中此种静态库的对应格式是什么,怎样生成。
             Linux/UNIX中没有DLL,程序还是编译成.o形式,只是在需要的时候,把所需要的函数对应的.o文件直接链接到一起即可。
      

  11.   

    以前用 oracle的occi的时候,oracle提供了头文件和很多.a,.so的文件,在链接的时候使用,我想那就是静态库吧。动态库应该也有的吧,apache动态加载的那些模块应该都是动态库吧。另外,在VC7中通过#pragma  comment(lib,"dllname.lib")的方法来连接到动态库,请问有其他的方法吗?
      

  12.   

    1.一般情况下,linux下的.a为静态库,.so为动态库
    2.除#pragma  comment(lib,"dllname.lib")以外,
    1)可把lib加入项目中
    2)如果有是dll,可用API的LoadLibrary加GetProAddress来调用
      

  13.   

    动态库的lib和静态库的lib文件是不同的
      

  14.   

    linux下源代码生成的的目标文件是.o,相当于windows下的.obj
    linux下的静态库文件是.a,相当于windows下的.lib
    linux下的动态库文件是.so(unix下是.sl),相当于windows下的.dll基本的知识。
      

  15.   

    linux下对应的api有:
    dlopen,对应windows下的LoadLibrary
    dlsym,对应windows下的GetProcAddress
    dlclose,对应windows下的FreeLibrary还是基本的知识
      

  16.   

    生成dll时生成的lib文件定义了dll中函数的入口点(不是入口地址),用于和对应的dll绑定的,实际的功能在dll中。
      

  17.   

    感谢大家的帮助,还有一个问题,搞懂了就给分,
    当生成了dll后(通过__declspec(dllexport)暴露函数),有dll文件、头文件和lib文件,
    除了LoadLibrary,GetProcAddress ,#pragam comment(lib ,"dllname.lib")外,
    还有什么方法链接到dll,此时dll的头文件中的函数都是用 __declspec(dllexport)定义的,但是在其他工程中应用时应该用 __declspec(dllimport) ,此时该怎么办,是不是不用原来的头文件,还是自己重写头文件,对要用到的函数用__declspec(dllimport)定义,关键是lib文件怎么处理,在VC.net中屡试不爽。
      

  18.   

    另外,linux下的2进制可执行文件、.so文件和.o文件都是编译器生成的(比如gcc/g++),而.a文件不是(同windows一样,.lib文件是由lib工具生成的,虽然可以用link生成,但最终调用的还是lib工具把.obj打包生成的,其实就是多个.obj文件合并的结果),.a是用ar工具打包生成的。
      

  19.   

    刚回了一个,也许对你有帮助
    http://community.csdn.net/Expert/topic/3862/3862315.xml?temp=.2364771
    (我是用VC++ 6.0的)
    1.应该没有第三种方法了
    2.头文件应该重写
    我原来一直用__export关键字的,不用__declspec也可以
      

  20.   

    同意。另外,__declspec(dllexport)不能完全替代.def文件,特别是当使用__stdcall函数类型的时候,只能用.def文件来定义导出的函数名,请参考一下msdn。
      

  21.   

    昨天,通过重新编写头文件用__declspec(dllimport)导入函数,然后直接在lib文件依赖项目中加入dll 的lib文件,没有用#pragam comment 也通过了,和前几天的做法一摸一样的,哎!另外,生成dll的时候,VC.net还生成了个.exp文件,这个文件又是干什么用的啊。
      

  22.   

    (1)函数“暴露”方法:
    a:通过__declspec(dllexport)来表明此函数外界可以使用;
    b.通过定义.def文件来说明函数外显;
    Question3:
       并不是完全等价。因为__declspec(dllexport)在vc下编译生成dll,会在dll输出节中改函数名字。所以,如果能保证调用该dll的程序也是用vc编译的则没有问题。否则使用其他编译器会造成麻烦,例如无法连接
      

  23.   

    question5: DLL包含一个导出函数表(lib),它包含了函数在DLL内的地址,但当客户程序装入DLL时并不知道要调用的函数地址,它是通过函数的符号化名字和序号来识别这些函数的。
    question3:由于编译器会对函数做名字修饰,这在DLL和客户程序同使用一种语言编写的情况中不存在问题,如果是不同的语言,则必须考虑该问题。可通过在.DEF文件的EXPOTRS字段使用别名指定导出的符号名
    字从而与客户程序编译器所产生的名字修饰一致。