c++ - LNK2001 尝试使用来自 Visual Studio C++CLI 项目的 v8

标签 c++ visual-studio-2010 c++-cli v8

当构建一个简单的 hello-world-style 项目试图嵌入 v8 时,我得到了一个

error LNK2001: ""public: static class 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;
}

编译似乎没问题,我添加了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).

除了v​​8_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

现在呢?

最佳答案

我想通了两件事:

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

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

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

HandleScope handle_scope;

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

关于c++ - LNK2001 尝试使用来自 Visual Studio C++CLI 项目的 v8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11374507/

相关文章:

c++ - 类模板的嵌套模板参数推导不起作用

generics - C++/CLI 值类约束将无法编译。为什么?

c# - 如何处理混合模式项目中的打印?

asp.net-mvc - 如何在新的 Asp.Net MVC 3 项目对话框中添加自定义项目模板?

c# - 在 C# - C++/CLI - C++ Windows 窗体应用程序退出之前跟踪 - 并正确结束 - native 和托管线程

c++ - 编译时检查和运行时检查 'at the same time'

c++ - 数据对齐的差异

c++ - 相同模板类但不同模板类型的 protected 成员

c++ - 在 Visual C++ 中使用 union

asp.net-mvc - Entity Framework 将 s 添加到我的 .dbo