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):提供每种库、库使用方法的示例工程。
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):提供每种库、库使用方法的示例工程。
解决方案 »
- 关于edit的问题
- 如何获得程序自身的版本号?GetFileVersionInfo不行,因为他只能够返回IE的版本
- 不使用数据库系统,怎么办???
- 关于完成端口模型,请高手指点
- 串口通信(API)---怎样实现数据正确性检查??怎样转化为数字??
- 人笨的没有办法,连如何在任务栏上显示一个指定的ICON图标都不会? 50个大洋求教! 求高人指点...
- 怎样得到从外面拖动到程序中的全路径名
- 我定义了一个对话框并添加了控件,编译时出的错误。
- 帮忙!!!!!
- 如何实现一元多项式的加、减、乘法?
- 这个错误怎么改啊?
- 如何把VC++编译的可执行文件制成能够安装的软件,并且可以在没有VC环境的机器上正常运行!
_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
下的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 才能正常运行
把h文件加入工程,lib库加入module
把lib,dll文件拷贝到工程目录下Debug或Release下
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是一回事。
extern "C" __declspec(dllimport) return_value funName(arglist);
的方法能够成功连接,运行了。但是在VC7中和VC6的"把h文件加入工程,lib库加入module "对应操作是什么啊?
另外我想 动态库的 lib文件和静态库的lib文件应该是不同的吧。
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
Linux/UNIX中此种静态库的对应格式是什么,怎样生成。
Linux/UNIX中没有DLL,程序还是编译成.o形式,只是在需要的时候,把所需要的函数对应的.o文件直接链接到一起即可。
2.除#pragma comment(lib,"dllname.lib")以外,
1)可把lib加入项目中
2)如果有是dll,可用API的LoadLibrary加GetProAddress来调用
linux下的静态库文件是.a,相当于windows下的.lib
linux下的动态库文件是.so(unix下是.sl),相当于windows下的.dll基本的知识。
dlopen,对应windows下的LoadLibrary
dlsym,对应windows下的GetProcAddress
dlclose,对应windows下的FreeLibrary还是基本的知识
当生成了dll后(通过__declspec(dllexport)暴露函数),有dll文件、头文件和lib文件,
除了LoadLibrary,GetProcAddress ,#pragam comment(lib ,"dllname.lib")外,
还有什么方法链接到dll,此时dll的头文件中的函数都是用 __declspec(dllexport)定义的,但是在其他工程中应用时应该用 __declspec(dllimport) ,此时该怎么办,是不是不用原来的头文件,还是自己重写头文件,对要用到的函数用__declspec(dllimport)定义,关键是lib文件怎么处理,在VC.net中屡试不爽。
http://community.csdn.net/Expert/topic/3862/3862315.xml?temp=.2364771
(我是用VC++ 6.0的)
1.应该没有第三种方法了
2.头文件应该重写
我原来一直用__export关键字的,不用__declspec也可以
a:通过__declspec(dllexport)来表明此函数外界可以使用;
b.通过定义.def文件来说明函数外显;
Question3:
并不是完全等价。因为__declspec(dllexport)在vc下编译生成dll,会在dll输出节中改函数名字。所以,如果能保证调用该dll的程序也是用vc编译的则没有问题。否则使用其他编译器会造成麻烦,例如无法连接
question3:由于编译器会对函数做名字修饰,这在DLL和客户程序同使用一种语言编写的情况中不存在问题,如果是不同的语言,则必须考虑该问题。可通过在.DEF文件的EXPOTRS字段使用别名指定导出的符号名
字从而与客户程序编译器所产生的名字修饰一致。