2

在构建一个尝试嵌入 v8 的简单 hello-world 风格项目时,我得到一个

错误 LNK2001: ""public: static class v8::Local __cdecl v8::String::New(char const *,int)" (?New@Str​​ing@v8@@SA?AV?$Local@VString@v8@@ @2@PEBDH@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;
}

编译好像没问题,我添加了node 0.8.0项目的v8目录(node-v0.8.0\deps\v8\include)。在链接方面,我将这些库添加为附加依赖项。

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',但后来我又得到了大量的 LNK2001。一个小小的选择:

エラー 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 *)" (?__wgetmainargs@@$$J0YAHPAHPAPAPA_W1HPAU_startupinfo@@@Z)" は未解決です。 c:\...\HelloC++CLIWorld\HelloC++CLIWorld\MSVCMRTD.lib(ManagedMain.obj)  HelloC++CLIWorld

怎么办?

4

1 回答 1

0

我想出了两件事:

  • Visual Studio 不会抱怨您作为附加依赖项添加到链接器设置的 lib 文件中的错误体系结构,而只是忽略该文件(我认为我正在以默认警告级别运行)
  • 使用dumpbin mylib.lib /headers|more显示我认为是为 x64 构建的库实际上是为 x86 构建的

正如我在问题的更新部分中所写的那样,由于错误,我无法使 x86 构建工作,LNK2005但是当我针对 x64 v8 lib(或者更确切地说,包含 v8 的 node.lib)构建 x64 时,链接工作正常。

坏消息:在管理了编译步骤之后,现在是链接步骤,我得到了一个运行时异常,即使我按照我应该做的那样做

HandleScope handle_scope;

before new'ing the v8::String. But that's for another question. For now, linking is solved, at least on x64. Oh happy day!

于 2012-07-08T05:40:41.100 回答