LNK2001正在尝试使用Visual Studio C++CLI项目中的v8
LNK2001 trying to use v8 from Visual Studio C++CLI project
当构建一个简单的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上是这样。哦,快乐的一天!
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 试图在visual studio上用C++创建一个桌面应用程序
- 如何在MS Visual Studio 2019中运行QT UI
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Visual Studio Code - C++ Debugger 無法啟動
- 不能包含 cliext 标头(对于 c++ cli、Visual Studio)
- Visual Studio:C++\CLI 包装程序集路径依赖性问题
- Visual Studio C /CLI与模板的神秘错误
- 是Windows窗体应用程序(在visual studio c++中)自动c++/CLI
- Visual Studio 2010在编译C++/CLI项目时出现奇怪错误
- LNK2001正在尝试使用Visual Studio C++CLI项目中的v8
- 用于 CLI 构建的嵌入式C++的 Visual Studio 自定义生成定义
- 在 C++/CLI Visual Studio C++ 中以指定的数组位置将文本框中的值保存在 char 中
- 使用c#或cli/c++在visual studio中的winforms中为图形中的数据点着色或高亮显示
- Visual Studio Designer在VS2012中不适用于C++/CLI文件,而在VS2005中则不起作用。知道为什么吗?
- 通过c++ /CLI包装器连接本地c++ dll与c#, Visual Studio问题
- 如何在Visual studio中从c++ /CLI和c#调用c++ /CLI
- Visual studio 2013 -如何在已经包含#include的对象上添加一个对象?c++ / cli
- Visual Studio 2013 - 更改 C++/CLI Windo 窗体中特定事件"sender"的属性,而无需切换所有事件