2016-07-05 8 views
1

私は私の問題を説明するために2つのソリューションを設定しました。合計3つのプロジェクトです。デバッグモードでコンパイルしますが、リリースモードでコンパイルしても問題は解決しません。Visual Studio LNK1104最小限の例

MyRunnerCore.lib3rdParty.libが必要です。それはなぜですか、私はそれに対して何ができますか?

SolutionLayout

アイデアは、私はlibにプロジェクト(正常に動作します)などの第三者を構築することである。ここでは

はフォルダが構成されている方法を説明するための写真です。それから、私は、libファイルを使ってcppファイルでMyRunnerCoreを構築します(うまく動作します)。最後に私はMyRunnerCore.lib(LNK1104)を使用するコンソールアプリケーションをビルドします。出力ウィンドウには、次のように表示されます。

1>------ Build started: Project: MyRunnerCore, Configuration: Release Win32 ------ 
1> Core.cpp 
1> MyRunnerCore.vcxproj -> C:\SO\MyRunner\Release\MyRunnerCore.lib 
2>------ Build started: Project: MyRunner, Configuration: Release Win32 ------ 
2> main.cpp 
2>LINK : fatal error LNK1104: cannot open file '3rdParty.lib' 
========== Build: 1 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

ここでは、Project Iがいくつかの設定を編集したときに注釈を付けるソースファイルがあります。

ThirdPartyClass.cpp

#include "ThirdParyClass.hpp" 
int ThirdParyClass::GenerateNumber() 
{ return 4; } 

ThirdPartyClass.hpp

#pragma once 
class ThirdParyClass 
{ public: int GenerateNumber(); }; 

main.cppに

//MyRunner Properties: 
//Project Dependencies Added MyRunnerCore 
//Include Directories Added $(SolutionDir) 
//Library Directories Added $(OutDir) 
#include <MyRunnerCore\Core.h> 
#pragma comment (lib, "MyRunnerCore.lib") 

int main() { Core c{}; return c.Run(); } 

Core.cpp

#include "Core.h" 
//MyRunnerCore Properties: 
//Added To Include Path C:\SO\3rdParty 
//Added To Library Path C:\SO\3rdParty\Debug 
#include <3rdParty\ThirdParyClass.hpp> 
#pragma comment(lib, "3rdParty.lib") 

int Core::Run() 
{ 
    ThirdParyClass tp{}; 
    return tp.GenerateNumber(); 
} 

#pragma once 
class Core 
{ public: int Run(); }; 

Core.hなぜリンカがリンクする3rdParty.libを必要としていますか?

リンカービルドを行うための設定がありませんMyRunnerCore.lib3rdParty.libへの参照なしでビルドできますか?

+1

MSVCは静的ライブラリを組み合わせた機能をサポートしていません。明示的に第三者のlibにリンクする必要があります。リンカーがライブラリを探すために設定されているパスに含まれている必要があります。 – drescherjm

答えて

0

は書いた:

Librarian -> General -> Link Library Dependencies -> Yes 

は正しいです。ただし、以下を使用する:

#pragma comment (lib, ...) 

は互換性がありません。

ライブラリは、入力用tsandyする

Librarian -> Additional Libraries -> 3rdParty.lib;%(AdditionalDependencies) 

感謝を使用して含まれることがあります。

1

リンカーはファイルThirdParyClass.libの場所を知らないようです。 MyRunnerのプロジェクト設定で、このファイルを含むフォルダをAdditional Library Directoriesに追加します。 tsandyとして

+1

はい、それは当てはまりますが、リンカーはそれを知る必要はありません。リンカーにMyRunnerCoreにThirdPartyClass.libを含めるようにします。私がMyRunnerをビルドするときに提供する必要はありません。 – Johannes

+0

私の理解では、 'Core'がコンパイルされるとき、' ThirdPartyClass.lib'から 'ThirdPartyClass'の実装を実際にはコピーしません。代わりに、 "ThirdPartyClassの実装のためには、" ThirdPartyClass.lib'を参照するプレースホルダーを残します。私はこのメカニズムを回避するための設定を知らない。 – tsandy

+0

これはこの質問の中核であり、ドキュメントのリンクはありますか? – Johannes

関連する問題