酒鬼z

我自将心向明月,独卧沙场醉圆缺

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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).

posted on 2013-07-17 09:53  酒鬼z  阅读(262)  评论(0)    收藏  举报