程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Visual C++ 編譯器選項 /MD、/ML、/MT、/LD

Visual C++ 編譯器選項 /MD、/ML、/MT、/LD

編輯:.NET實例教程

前段時間編譯一個引用自己寫的靜態庫的程序時老是出現鏈接時的多個重定義的錯誤,而自己的代碼明明沒有重定義這些東西,譬如:
LIBCMT.lib(_file.obj) : error LNK2005: ___initstdio already defined in libc.lib(_file.obj)
LIBCMT.lib(_file.obj) : error LNK2005: ___endstdio already defined in libc.lib(_file.obj)
LIBCMT.lib(_file.obj) : error LNK2005: __cflush already defined in libc.lib(_file.obj)
LIBCMT.lib(_file.obj) : error LNK2005: __iob already defined in libc.lib(_file.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __alloc_osfhnd already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __set_osfhnd already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __free_osfhnd already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __get_osfhandle already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(osfinfo.obj) : error LNK2005: __open_osfhandle already defined in libc.lib(osfinfo.obj)
LIBCMT.lib(tolower.obj) : error LNK2005: __tolower already defined in libc.lib(tolower.obj)
LIBCMT.lib(tolower.obj) : error LNK2005: _tolower already defined in libc.lib(tolower.obj)
等等。

所 以初步估計是編譯器的問題,通過網上搜索和查看msdn,原來是Visual C++ 編譯器選項的關於單線程或多線程運行時例程的問題:我的那個靜態庫編譯時/ML單線程版本的,而引用它的程序是/MT多線程版本的,他們在編譯分別講 libc.lib和LIBCMT.lib連接到各自的代碼中,估計libc.lib和LIBCMT.lib只是單線程與多線程的區別,基本代碼相差無幾, 所以會產生鏈接時重定義錯誤;然後把編譯靜態庫的選項/ML改成/MT就沒事了。

要注意的是:/MD也是多線程版本的;被應用的用戶鏈接庫 要和應用者有相同的編譯選項,/MD與/MT一起有時候會有錯誤的,有時候就沒有,我試過這種情況;而/MD和/ML似乎是沒有問題的;/MT和/ML是 肯定會有問題的。有沒有其他情況就不清楚了,有興趣的可以測試一下,^_^

如果是代碼是用於多線程的,最好編譯成多線程版本的,否則可能會出現一些意想不到的問題。

編譯器選項設置(vc6):工程 -> 設置 -> C/C++ -> 工程選項   裡可以修改

附:

下面是msdn關於Visual C++ 編譯器選項的說明:

這些選項選擇單線程或多線程運行時例程,指示多線程模塊是否為 DLL,並選擇運行時庫的發布版本或調試版本。


選項 說明 /MD 定義 _MT_DLL 以便同時從標准 .h 文件中選擇運行時例程的多線程特定版本和 DLL 特定版本。此選項還使編譯器將庫名 MSVCRT.lib 放入 .obj 文件中。

用此選項編譯的應用程序靜態鏈接到 MSVCRT.lib。該庫提供允許鏈接器解析外部引用的代碼層。實際工作代碼包含在 MSVCR71.DLL 中,該庫必須在運行時對於與 MSVCRT.lib 鏈接的應用程序可用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved