2012-07-07 56 views
2

當構建一個簡單的hello世界風格的項目試圖嵌入V8我得到一個LNK2001試圖使用V8從Visual Studio C++ CLI項目

error LNK2001: ""public: static class v8::Local __cdecl v8::String::New(char const *,int)" ([email protected]@[email protected]@[email protected]@[email protected]@@[email protected]@Z)"

什麼是錯的我的項目設置,我可以」似乎弄明白了。這是我的源文件:

#include "stdafx.h" 
#include "v8.h" 

using namespace System; 

#pragma unmanaged 

void test() 
{ 
    v8::Local<v8::String> source = v8::String::New("'Hello' + ', World'"); 
} 

#pragma managed 

int main(array<System::String ^> ^args) 
{ 
    return 0; 
} 

編譯似乎做工精細,我添加的節點0.8.0項目的V8目錄(節點v0.8.0 \的DEP \ V8 \包括)。就連接而言,我將這些庫添加爲附加依賴項。

node-v0.8.0\Release\lib\v8_base.lib 
node-v0.8.0\Release\lib\v8_snapshot.lib 

我在Windows 7,64位。我的項目設置爲構建x64,就像node.js(使用'Windows x64安裝程序'安裝的)一樣。怎麼了?

更新我認爲,當爲x64構建時,我添加的附加依賴項被完全忽略(不管我添加與否,錯誤消息都是相同的)。但是當爲win32構建時,我收到了不同的錯誤消息。 (順便說一句:這是否意味着lib文件適用於x86而不是x64 - 正如我所設想的那樣 - 爲什麼鏈接器不告訴我?更新:dumpbin告訴我,這些lib文件確實適用於x86)。

除了v8_base和v8_snapshot,鏈接器錯誤導致我補充

winmm.lib 
ws2_32.lib 

哪個擺脫所有的「解析外部符號」錯誤。但現在我得到一個LNK2005 「已定義」 錯誤:

エラー 1 error LNK2005: __matherr は既に LIBCMT.lib(_matherr_.obj) で定義されています。 c:\...\HelloC++CLIWorld\HelloC++CLIWorld\MSVCRTD.lib(merr.obj) HelloC++CLIWorld 

我試過/NODEFAULTLIB:LIBCMT,然後我得到一個LNK2001 「解析的外部符號」:

エラー 1 error LNK2001: 外部シンボル "__HUGE" は未解決です。 c:\...\HelloC++CLIWorld\HelloC++CLIWorld\v8_base.lib(heap.obj) HelloC++CLIWorld 

我也試過`/ NODEFAULTLIB:MSVCRTD」 ,但後來我又得到了大量的LNK2001s。一個很小的選擇:

エラー 1 error LNK2001: 外部シンボル "___native_dllmain_reason" は未解決です。 c:\...\HelloC++CLIWorld\HelloC++CLIWorld\MSVCMRTD.lib(mstartup.obj) HelloC++CLIWorld 
エラー 2 error LNK2001: 外部シンボル "___native_vcclrit_reason" は未解決です。 c:\...\HelloC++CLIWorld\HelloC++CLIWorld\MSVCMRTD.lib(mstartup.obj) HelloC++CLIWorld 
エラー 3 error LNK2001: 外部シンボル "___native_startup_state" は未解決です。 c:\...\HelloC++CLIWorld\HelloC++CLIWorld\MSVCMRTD.lib(mstartup.obj) HelloC++CLIWorld 
エラー 4 error LNK2001: 外部シンボル "___native_startup_lock" は未解決です。 c:\...\HelloC++CLIWorld\HelloC++CLIWorld\MSVCMRTD.lib(mstartup.obj) HelloC++CLIWorld 
エラー 5 error LNK2001: 外部シンボル ""extern "C" int __cdecl __wgetmainargs(int *,wchar_t * * *,wchar_t * * *,int,struct _startupinfo *)" ([email protected]@[email protected]@@Z)" は未解決です。 c:\...\HelloC++CLIWorld\HelloC++CLIWorld\MSVCMRTD.lib(ManagedMain.obj) HelloC++CLIWorld 

現在呢?

+0

第二個更私人的問題,如果我可以的話:我真的那麼愚蠢嗎?作爲一名經驗豐富的開發人員,他在二十年前曾與Pascal,C,x86 asm一起玩過,並且花費了十多年的時間主要用Java和C#爲生,還有其他一些語言,我是如何爲簡單而苦苦掙扎的你好世界風格的應用程序(和嘿,我甚至不試圖打印字符串,只是創建它!)三個固體小時?我一定是愚蠢的! (簡單的確認也很好) – SuperHorst 2012-07-07 12:33:27

+0

「試圖從C++/CLI使用V8」並不完全是我們大多數人會認爲是「簡單的Hello世界風格的應用程序」。 – jalf 2012-07-07 13:59:36

+0

事實上,我正在使用CLI部分的問題? – SuperHorst 2012-07-07 22:55:23

回答

0

我想通了兩兩件事:

  • Visual Studio將不會抱怨你添加到鏈接器設置額外的依賴性一個lib文件中的錯誤架構,但恰恰忽略該文件(我想我在使用dumpbin mylib.lib /headers|more默認警告級別)
  • 運行表明,我認爲是專爲64位的庫實際上是針對x86

正如寫在更新 PA建rt我的問題,由於LNK2005錯誤,我無法使x86構建正常工作,但是當我針對x64 v8 lib(或者更確切地說,node.lib,其中包含v8)構建x64時,鏈接起作用。

壞消息是:在已經管理編譯步驟,現在鏈接步驟,我得到一個運行時異常,甚至當我,因爲我應該做的,之前新做

HandleScope handle_scope; 

'v8::String。但這是另一個問題。目前,鏈接已解決,至少在64位。哦,快樂的一天!

相關問題