2016-12-01 30 views
1

我試圖將項目添加到Visual Studio 2013中,該工程將在Visual Studio GUI中構建OpenSSL。我使用「makefile」項目設置作爲起點。Visual Studio使用下劃線前綴將OpenSSL構建爲符號

我已經成功地在Visual Studio命令行窗口上構建OpenSSL,並且它可以工作。但是,當我嘗試使用命令行中使用的完全相同的命令通過項目構建OpenSSL時,出現鏈接錯誤(LNK2001)。

使用dumpbin查看生成的.lib文件,我發現當我通過GUI構建OpenSSL時,下劃線('_')被附加到所有導出(因此稱爲BIO_read的函數將變爲_BIO_read)。

微軟這樣說LNK2001:https://msdn.microsoft.com/en-us/library/f6xx1b1z.aspx?f=255&MSPPError=-2147217396

具體來說,它說:

當一個符號是未解決的,您可以通過以下原則得到有關功能的信息在x86平臺上,對於以C編譯的名稱或C++中的extern「C」名稱的調用約定裝飾是:

__cdecl

函數帶有下劃線(_)前綴。

我認爲CL被稱爲略有不同的參數,這使得它發出下劃線的前綴,但我無法弄清楚究竟是不同的 - 在命令行中沒有不同,如果有在環境的差異變量我找不到相關的變量。

任何想法這裏發生了什麼?

+1

當您運行Visual Studio時,您實際上可以在構建日誌中看到它傳遞給鏈接器的* actual *標誌和參數。你是說如果你在命令行中做同樣的事情,你會得到不同的輸出結果嗎?如果是這樣,請檢查環境設置,路徑等方面的差異。 –

+0

@MartinBonner,是的,我已經看過構建日誌中傳遞給cl.exe的構建標誌(我可以看到.obj中的下劃線文件也是),而且它們看起來並沒有什麼不同。我在項目命令的開頭運行了「set」,但結果似乎沒有我知道會影響CL的內容。 – nitzanms

+0

下劃線由函數名稱前綴,因爲它是前綴。你有沒有在你的項目文件中包含任何必要的庫? – 1201ProgramAlarm

回答

0

通過批處理文件運行構建並從項目屬性中的Preprocessor Definitions字段中刪除$(NMakePreprocessorDefinitions),使我可以成功構建OpenSSL,而不會產生下劃線前綴。

相關問題