LNK2001正在尝试使用Visual Studio C++CLI项目中的v8

LNK2001 trying to use v8 from Visual Studio C++CLI project

本文关键字:C++CLI Studio 项目 v8 Visual LNK2001      更新时间:2023-10-16

当构建一个简单的hello世界风格的项目试图嵌入v8时,我得到了一个

错误LNK2001:"public:static类v8::Local __cdecl v8::String::New(char const*,int)"(?New@String@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;
}

编译似乎很好,我添加了node0.8.0项目的v8目录(node-v0.8.0\deps\v8\include)。在链接方面,我添加这些库作为额外的依赖项。

node-v0.8.0Releaselibv8_base.lib
node-v0.8.0Releaselibv8_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++CLIWorldHelloC++CLIWorldMSVCRTD.lib(merr.obj)  HelloC++CLIWorld

我尝试了/NODEFAULTLIB:LIBCMT,然后我得到了一个LNK2001"未解析的外部符号":

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

我也尝试过"/NODEFAULTLIB:MSVCRTD",但后来我又得到了大量的LNK2001。小小的选择:

エラー 1   error LNK2001: 外部シンボル "___native_dllmain_reason" は未解決です。    c:...HelloC++CLIWorldHelloC++CLIWorldMSVCMRTD.lib(mstartup.obj) HelloC++CLIWorld
エラー 2   error LNK2001: 外部シンボル "___native_vcclrit_reason" は未解決です。    c:...HelloC++CLIWorldHelloC++CLIWorldMSVCMRTD.lib(mstartup.obj) HelloC++CLIWorld
エラー 3   error LNK2001: 外部シンボル "___native_startup_state" は未解決です。 c:...HelloC++CLIWorldHelloC++CLIWorldMSVCMRTD.lib(mstartup.obj) HelloC++CLIWorld
エラー 4   error LNK2001: 外部シンボル "___native_startup_lock" は未解決です。  c:...HelloC++CLIWorldHelloC++CLIWorldMSVCMRTD.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++CLIWorldHelloC++CLIWorldMSVCMRTD.lib(ManagedMain.obj)  HelloC++CLIWorld

现在怎么办?

我发现了两件事:

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

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

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

HandleScope handle_scope;

在新建CCD_ 4之前。但这是另一个问题。目前,链接已解决,至少在x64上是这样。哦,快乐的一天!