2016-07-17 6 views
1

ビジュアルスタジオ(私にとっては2015)がヘッダーファイルから.libファイル名を検出する方法を理解できません。
LNK2019の代わりにVisual Studio LNK1104

例Iは、HTTPリクエスト経由で接続するための簡単なプログラムを書くことboost/asioを使用して1
。ソースファイルには、その上に<boost/asio.hpp>が含まれています。私はまた、ブーストのフォルダを指すようにC/C++/General/Additional Include Directoriesを設定します。その後
は、私は解決策を構築し、エラーが発生します。

Error LNK1104 cannot open file 'libboost_system-vc140-mt-gd-1_61.lib' 

しかし、Visual Studioはから名前libboost_system-vc140-mt-gd-1_61.libを見つけたところ私は知りません。
- 評価値と継承値の両方のためのLinker/Input/Additional Dependencies/Edit...で見ると、libboost_system-vc140-mt-gd-1_61.lib
という名前の項目はありません - 私は<boost/asio.hpp>で何とかによって、それはコンパイラにいくつかの情報を設定することを考えて:あなたはLIBファイルが必要な場合は、libboost_system-探し」 vc140-MT-GD-1_61.lib、それは私の実装である」が、私はブーストフォルダで検索、何のソースファイルが存在しない含まれている "libboost_system-vc140-MT-GD-1_61.lib" を
enter image description here


一般に、ヘッダーファイルで宣言された関数の一部がVisual Studioに実装されていないと、LNK2019: unresolved external symbol ...がスローされます。
その実装がabcxyz.libファイルの場合、ユーザーはLinker/Input/Additional Dependenciesに行き、abcxyz.libなしで追加し、Linker/General/Additional Libary Directoriesの.libファイルを含むフォルダを指定します。この場合、Error LNK1104 cannot open file 'abcxyz.lib'がスローされます

なぜ、上記の例でLNK2019エラーの代わりにLNK1104エラーが発生するのですか?

例2
私はOpenCV 2.4.10ライブラリを使用するプロジェクトに取り組んでいます。ディストリビューションでは、彼らは私にソースコード付きのプロジェクトを提供しますが、私にライブラリを添付することはありません。
次に、最新のOpenCV 2.4.13をダウンロードし、追加のインクルードフォルダ、追加のライブラリフォルダ、追加の依存関係(opencv_core2413.lib)など、プロジェクト用にセットアップしました。
すべてがOKのように見えますが、私はプロジェクトをビルドするとき、それは私にエラーを与える:

Error LNK1104 cannot open file 'opencv_core2410d.lib' 

私は評価値(opencv_core2413.libが含まれている)と継承された値の両方にLinker \ Input \ Additional Dependenciesを見ていないが、ないがあります'opencv_core2410d.lib'という名前の項目です。
は、プロジェクトが適用されます別の共有プロパティシートで探してみたがのがここで起こる私は、このエントリを削除したいが、それはそう

ここで見つけることができません「opencv_core2410d.lib」
という名前の入力項目は、ありません?誰も私のために説明することができますか?ありがとう

+1

'libboost_system-vc140-mt-gd-1_61.lib'は' #pragma comment(lib libboost_system-vc140-mt-gd-1_61.lib) 'に由来しています。 http://www.boost.org/doc/libs/1_61_0/boost/config/auto_link.hpp – drescherjm

+0

'opencv_core2410d.lib'は、デバッグビルドに必要なデバッグインポートライブラリです。 – drescherjm

+1

ここでは、#pragma comment(lib libname)の追加使用について詳しく説明します:http://stackoverflow.com/questions/5184889/how-does-the-c-linker-know-which-lib-contains-which-functions – drescherjm

答えて

0

、あなたは.objファイルにこれは、ライブラリパスにlibnameを探すために、リンカが発生し、正しいライブラリが使用されることを保証

#pragma comment(lib, "libname.lib") 

使用して、ライブラリリクエストを注入することができます。

これは、リンク上で/nodefaultlibを使用すると無効にすることができます。

ウィンドウでは、クラスの実装がリリースとデバッグの間で変更されます(追加のトラッキングメンバーがデバッグ内の構造に追加されます)。

Tidy upとCRTの起動を実装するメカニズムは、DllMainが呼び出されるかどうかによって異なります。

最近の視覚的なスタジオでも、「値」のためにその値を持つ各オブジェクト・ファイルに宣言を置く

#pragma detect_mismatch("name", "value") 

を持っています。これにより、構造がバージョンオプションとコンパイルオプションの間で変更された場合でも、互いに互換性がなくなります。

1

LNK1104Library Directoriesにライブラリの場所を設定する必要があることがわかります。

boost::asioは、エラーメッセージの場合はboost::systemに依存します。 boost::systemではなく、はヘッダー専用ライブラリです。

ライブラリの場所をLibrary DirectoriesのソリューションのプロパティページのVC++ Directoriesに追加する必要があります。

boostライブラリをまだ作成していない場合は、記事にはhere、またはhereからダウンロードできます。

OpenCVライブラリの場所をソリューションのプロパティページに追加すると、Example 2が修正されます。 Visual Studioに

関連する問題