Link Errors and C Runtime Library

這是在Windows的平台上,使用Visual Studio寫C\C++時,常遇到的問題。由其是在使用3rd party library時特別容易遇到。

你可能會看到類似以下的Link Errors:
LIBCMTD.lib(printf.obj) : error LNK2005: _printf already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(fclose.obj) : error LNK2005: _fclose already defined in MSVCRTD.lib(MSVCR80D.dll)

而發生這些Link Errors的原因,在猴子靈藥的MSVC與CRT的恩怨情仇中已有非常完整的介紹,在此就不再贅述。

簡單的來說,這是因為你的project和3rd party library各別使用了不同版本的CRT(C Runtime Libraries),而導致一些symbol重複定義的問題。

CRT就是放置printf()、fopen()…等I/O操作的函式定義(definition)的library;而其版本不唯一,你可以在Project -> Properites… -> Configuration Properties -> C/C++ -> Code Generation -> Runtime Library中做選擇。

共有以下4種選擇:
Multi-threaded Debug (/MTd)
Multi-threaded (/MT)
Multi-threaded Debug DLL (/MDd)
Multi-threaded DLL (/MD)

當你的project和3rd party library各自使用了不同版本的CRT,則linker會發現有兩個function definition(因為不同版本的CRT有各自的function definition),這就違反了C++的One Definition Rule (ODR),因而產生上述的Link Errors。

最簡單的解決方法就是讓你的project和3rd party library都使用相同的CRT,這樣一來在Link時會發現,整個build出來的.exe檔就只有一份function definition,所以就不會產生symbol重複定義的問題。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s