2

v8を埋め込もうとする単純なhello-worldスタイルのプロジェクトを構築すると、

エラー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;
}

コンパイルは正常に機能しているようです。ノード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

私はWindows7、64ビットを使用しています。私のプロジェクトは、node.js(「Windowsx64インストーラー」を使用してインストール)と同様に、x64をビルドするように設定されています。どうしたの?

更新x64用にビルドする場合、追加した依存関係は完全に無視されることがわかりました(追加したかどうかに関係なく、エラーメッセージは同じです)。しかし、win32用にビルドすると、さまざまなエラーメッセージが表示されます。(ところで:それは、libファイルがx64ではなくx86用であることを意味します-私が想定したように-そしてなぜリンカーは私にそう言わなかったのですか?更新: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

私は2つのことを理解しました:

  • Visual Studio は、追加の依存関係としてリンカー設定に追加する lib ファイルの間違ったアーキテクチャについて文句を言うことはありませんが、ファイルを無視するだけです (デフォルトの警告レベルで実行していると思います)。
  • を使用するdumpbin mylib.lib /headers|moreと、x64 用にビルドされていると思っていたライブラリが、実際には x86 用にビルドされていることが明らかになりました

私の質問の更新部分に書かれているように、LNK2005エラーのために x86 ビルドを動作させることができませんでしたが、x64 v8 lib (または v8 を含む node.lib) に対して x64 用にビルドするとリンクが機能しました。

悪いニュース: コンパイルのステップを管理し、リンクのステップを実行した後、実行することになっている場合でも、実行時例外が発生します。

HandleScope handle_scope;

を新しくする前にv8::String。しかし、それは別の質問です。今のところ、少なくとも x64 ではリンクは解決されています。ああ幸せな日!

于 2012-07-08T05:40:41.100 に答える