11

我有一個使用OpenGL 3.2(+ libs)和FreeType2的程序。然後用Boost和OpenSSL開發另一個程序。 OpenGL方面是爲了確保文本可以被渲染,boost/openssl程序是做一個安全的登錄/遊戲服務器。'LIBCMT'與其他庫的使用衝突+無法解析的外部符號

兩個程序都可以正常工作。

但是,將Boost和OpenSSL添加到遊戲(GL + freetype)項目中導致它無法鏈接。

我已經鏈接了以下庫以及包括文件夾在內。

glimg.lib glutil.lib glfw.lib opengl32.lib freetype.lib glew32.lib USER32.LIB libeay32.lib ssleay32.lib

接頭誤差。

1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library 
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol [email protected] 
1>.\BasicTexture.exe : fatal error LNK1120: 13 unresolved externals 

運行時庫設置爲多線程DLL(/ MD)

我不知道做什麼,我會很感激的任何幫助。

+3

未解決的外部事件是由於未鏈接到所需的庫('Advapi32.lib'和'Gdi32.lib')。第一個警告表示您的項目和您鏈接的某些庫與CRT有不兼容的鏈接器設置。除此之外,您似乎沒有編譯Unicode版本。這是有原因的嗎? – IInspectable

+0

謝謝蒂姆。不知道在unicode的東西,我只是用premake4來做出vs孤立,並改變了我需要的東西(我已經選擇了是否爲unicode)。你想讓它成爲一個答案,因爲你已經修好了!構建成功。非常感謝你! :) – Andrew

回答

13

當編譯器生成引用外部定義的對象或函數的代碼並且鏈接程序未能找到它們時,會生成未解析的外部錯誤消息。要生成代碼調用一個函數調用編譯器只需要一個聲明:

extern "C" BOOL DeregisterEventSource (HANDLE hEventLog); 

這是足夠的信息來產生call指令(除了目標地址)。 extern關鍵字通知編譯器該實現是在別處定義的。因此它無法知道後面必須填寫的目標地址。當編譯器完成時,鏈接器的工作是將各個部分連接起來。它使用從導入庫收集的信息來查找所需的偏移量。

Windows API調用很容易在錯誤日誌中發現。他們有一個__imp__前綴,有時是AW後綴,後跟@<n>,其中<n>指示參數所需的字節數。在Windows API調用的情況下,您可以查找MSDN中的函數(如DeregisterEventSource)。接近底部的是要求您可以在其中找到導入庫名稱。

衝突警告表明並非所有模塊都使用相同的運行時庫。儘管這只是一個警告,但它是一個嚴重的問題,應該得到解決。如果混合使用/MD/MT編譯器開關,並且混合使用發佈和調試運行時庫(如/MD/MDd),則會發出此警告。要診斷此消息,您可以使用/VERBOSE:LIB鏈接器開關來確定鏈接程序正在搜索哪些庫。有關此警告的更多信息,請參見MSDN link

+1

+1表示__imp__前綴暗示Windows API調用。我以前在鏈接器錯誤中看到過這個前綴,但不知道它爲什麼以符號爲前綴。 – riderBill

16

您正在嘗試使用/MD進行編譯,這可能是正確的選擇,但某些代碼(可能是其中一個庫)是使用/MT構建的,並且在同一個程序中無法使用這兩種方法。您需要確定使用/MT構建了哪個庫並使用/MD重建它。

+1

或者,如果你沒有罪魁禍首的源代碼,請將你的項目與'/ MT'聯繫起來 – AShelly

+0

感謝您的回覆,Tim在大約一個小時的問題評論中解決了這個問題。我想給他答案接受。但是+1。因爲在發佈問題之前我確實檢查了一切都是MD線程的。 – Andrew