5

これがなぜなのかわかりません。複数のプロジェクトに静的 *.lib を配布していますが、この静的 lib は多くの *.obj ファイルを生成します。これらの *.obj ファイルも *.lib と共に配布する必要があるようです。そうしないと、次のエラーが発生します。

1>LINK : fatal error LNK1181: cannot open input file 'nsglCore.obj'

どうしてこれなの?*.obj ファイルのデータを *.lib に含める方法はありますか? 多分コンパイラのスイッチ?

これは、静的ライブラリの構成です。

C/C++

/Od /GT /D "WIN32" /D "NDEBUG" /D "_LIB" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /MD /Yu"stdafx.hpp" /Fp"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\nsglCore-Win32-Release.pch" /Fo"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Source\Core\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt

司書

/OUT:"e:\Development\Projects\nsGameLib\Source\Core\Output\nsglCore-Win32-Release.lib" /NOLOGO /LTCG

これは、静的ライブラリを使用したプロジェクトの構成です。

C/C++

/O2 /Oi /I "E:\Development\Projects\nsGameLib\Samples\\DummyEngine\\" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /FD /EHsc /MD /Gy /Fo"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\\" /Fd"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\vc90-Release.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt

リンカ

/OUT:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Output\SampleOnlyCore-Win32-Release.exe" /INCREMENTAL:NO /NOLOGO /LIBPATH:"E:\Development\Projects\nsGameLib\Samples\..\Deployment\Libraries" /MANIFEST /MANIFESTFILE:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"e:\Development\Projects\nsGameLib\Samples\OnlyCore\Intermediate\SampleOnlyCore-Win32-Release.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT nsglCore  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
4

3 に答える 3

5

あなたのリンカー行は間違っていると思います。ライブラリには.lib接尾辞が必要です。そうnsglCoreあるべきnsglCore-Win32-Release.libか、多分nsglCore-$(TargetPlatform)-$(ConfigurationName).lib、または正しいマクロ展開が何であれ。

于 2009-05-21T03:49:05.153 に答える
4

通常、静的ライブラリはオブジェクト ファイルを生成しません。オブジェクト ファイルを作成してライブラリに配置すると、リンカーはそれらのライブラリでオブジェクト ファイルを検索します。

UNIX のコマンド ラインの観点から説明します。その方が理解しやすいからです (基本的なことを行う前に、VS がどのような操作を行うのかわかりません)。

実行可能ファイルを作成するためのサンプル コマンド ラインは次のとおりです。

gcc -c -o prog.o prog.c
gcc -o prog prog.o -L/libdir -lstdc

最初の行は、ファイルからオブジェクト ファイルを作成するだけCです。2 行目は、通常、次のようなルール セットに従って、オブジェクト ファイルをまとめて実行可能ファイルを作成します。

  • 明示的にリストされたすべての.oファイルがリンクされます。
  • それが完了したら、ライブラリを検索して、参照されているが未定義のシンボルを満たす他のオブジェクトを探します。

たとえばprog.c、行が含まれているとしますprintf("hello\n");。その結果、まだ満たされていないprog.o参照を含むファイルが作成されます。printf

リンカーは、その参照を満たすまで、指定されたライブラリを検索します。この場合、次の形式のすべてのファイルが検索されます/libdir/libstdc.ext

  • /libdirあなたの-Lオプションからです(ライブラリを検索するパス)。
  • /lib定数です。
  • stdc(から-l) 検索するライブラリの名前です。
  • ext1 つ以上の拡張子 (.a, .so, .slなど) です。

シンボルが見つかると、そのオブジェクト ファイルがリンクされて解決されます。これにより、への参照など、満たされていないシンボルがさらに表示される可能性があります。/libdir/libstdc.a(printf.o)/libdir/libstdc.a(putch.o)

特定の問題は、ライブラリを検索するのではなく、オブジェクト ファイルを直接リンクしようとしていることが原因である可能性があります。VS には、オブジェクト ファイル、ライブラリ検索パス、およびライブラリ名を指定するためのプロジェクト オプションが必要です (最新バージョンの場合はわかりませんが、MSVC の以前のバージョンがそうであったことは知っています)。

于 2009-05-21T02:12:10.037 に答える
3

ああ… Visual Studio は君には賢すぎる

ライブラリを含むプロジェクトに移動し、右クリックしてプロパティを表示します

構成プロパティに移動 | リンカ

下部: ライブラリ依存入力を使用 - いいえに設定

これは、.lib ファイルではなく、.obj ファイルを直接取得するための Visual Studio オプションです。リンクステップを回避してコンパイルを高速化するためだと思います。

一般に、lib ファイルを作成するプロジェクトを、それを使用するプロジェクトの依存関係として設定する必要があります (そのプロパティ ウィンドウの共通プロパティの下)。次に、Link Library Dependencies をオンにします。これは、ほとんどの場合にうまく機能します。

于 2009-05-21T02:11:19.537 に答える