1.lib和dll中全局变量的链接性及用法总结
今天在公司干完活后思考了lib和dll的链接性,然后做了测试,发现和我想象的不大相同,具体总结如下:
lib: lib中的全局变量在链接它的单元中是可以通过extern访问到的,但是链接它的单元如果定义了一个相同的全局变量那么lib中的全局变量将被忽略,而且不会出现重复定义的错误。lib中的函数则不相同如果链接它的单元有了相同的函数就会发生重复定义。在
lib的cpp中定义一个静态的变量会被所有用到这个lib的模块公用,在链接一个程序的时候会自动的去掉重复链接的lib保证某个lib只有一份代码存
在,如果在其他lib中直接包含这个cpp那么这个静态变量将不会被公用。所以如果要在几个lib中共享一部分代码那么最好把这部分公共代码也做成
lib,那样会避免问题的发生。
dll: 要
访问dll中的全局变量则要加extern __declspec(dllimport)前缀才行,那是因为这是一个导出的全局变量,如果dll中的全局
变量定义或者声明的时候不加__declspec(dllexport)前缀的话在使用它的单元是没有办法链接到这个全局变量的,这是和lib不一样的地
方,dll和lib的本质区别在于lib参加链接而dll只有显式导出的部分才参加链接,而且dll衔接产生的调用是通过一个导入表间接进行的,速度略慢
一点点。dll中变量导出之后它的名字和lib的有所不同带有__imp__前缀。
上面都是我的个人愚见,欢迎指教。
2.
What are the C and C++ libraries my program would link with?
Summary Table
|
Compile Old New IOStream Libraries Option IOStream or STL Linked With |
|
|
|
/ML No No LIBC.LIB |
|
/MLd No No LIBCD.LIB |
|
/MT No No LIBCMT.LIB |
|
/MTd No No LIBCMTD.LIB |
|
/MD No No MSVCRT.LIB |
|
/MDd No No MSVCRTD.LIB |
|
/ML No Yes LIBC.LIB, LIBCP.LIB |
|
/MLd No Yes LIBCD.LIB, LIBCPD.LIB |
|
/MT No Yes LIBCMT.LIB, LIBCPMT.LIB |
|
/MTd No Yes LIBCMTD.LIB, LIBCPMTD.LIB |
|
/MD No Yes MSVCRT.LIB, MSVCPRT.LIB |
|
/MDd No Yes MSVCRTD.LIB, MSVCPRTD.LIB |
|
/ML Yes No LIBC.LIB, LIBCI.LIB |
|
/MLd Yes No LIBCD.LIB, LIBCID.LIB |
|
/MT Yes No LIBCMT.LIB, LIBCIMT.LIB |
|
/MTd Yes No LIBCMTD.LIB, LIBCIMTD.LIB |
|
/MD Yes No MSVCRT.LIB, MSVCIRT.LIB |
|
/MDd Yes No MSVCRTD.LIB, MSVCIRTD.LIB |
你的程序使用了/ML编译选项,而程序依赖的.lib可能使用/MDd选项编译,造成链接冲突.
统一编译选项可回避此错误
Project Settings->C/C++ Tab->Category:CodeGeneration
Use run-time library组合框中选择Multithread Dll(或Debug Multithread Dll )
Summary Table for CRT DLLs Used
| Import Library Linked With | DLLs Used (Visual C++ 5.0|6.0) | DLLs Used (Visual C++ 4.2) | DLLs Used (Visual C++ .NET 2002| Visual C++ .NET 2003) |
| MSVCRT.LIB | MSVCRT.DLL | MSVCRT.DLL | MSVCRT.DLL |
| MSVCRTD.LIB | MSVCRTD.DLL | MSVCRTD.DLL | MSVCRTD.DLL |
| MSVCPRT.LIB | MSVCP(5|6)0.DLL | MSVCP7(0|1).DLL | |
| MSVCPRTD.LIB | MSVCP(5|6)0D.DLL | MSVCP7(0|1)D.DLL | |
| MSVCIRT.LIB | MSVCIRT.DLL | MSVCIRT.DLL | |
| MSVCIRTD.LIB | MSVCIRTD.DLL | MSVCIRTD.DLL |
3。有些lib可以不修改$(ProjectName),而在debug和release使用同样的名字
Import libraries contain only function stubs, and as such, don't need to have any debug symbols (you'd have a different library if you were linking to a different, debug DLL — but you normally don't, even though you build your program as Debug variant). If you want debug symbols for a system DLL, use the MS symbol server (see e.g. WinDbg documentation on how).
Also, it's not a linker error to link "debug DLL" with a "release program", because "debug" and "release" concepts don't exist at this level (you might get errors related to different ABI, but that's not quite the same).
浙公网安备 33010602011771号