問題タブ [linker]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 関数テンプレートの複数の定義
ヘッダー ファイルで関数テンプレートが定義されているとします。#include
ここで、このヘッダーに2 つの実装ファイルがあり、それぞれに関数テンプレートへの呼び出しがあるとします。どちらの実装ファイルでも、関数テンプレートは同じ型でインスタンス化されています。
リンカが の複数の定義について不平を言うと予想されるかもしれませんf()
。具体的にはf()
、テンプレートではない場合は、実際にそうです。
- リンカーが の複数の定義について文句を言わないのは
f()
なぜですか? - リンカーがこの状況を適切に処理しなければならないことが標準で指定されていますか? 言い換えれば、上記のようなプログラムをコンパイルしてリンクすることを常に期待できますか?
- リンカーが一連の関数テンプレートのインスタンス化を明確にするのに十分なほど賢い場合、インスタンス化された関数テンプレートの場合と同じであるのに、通常の関数に対して同じことができないのはなぜですか?
c++ - CRT、MFC、ATL などの静的または動的リンク
私が MFC を使い始めた 90 年代には、アプリを動的にリンクし、関連する MFC DLL を出荷していました。これによりいくつかの問題が発生し (DLL 地獄!)、代わりに静的リンクに切り替えました。MFC だけでなく、CRT と ATL も対象です。より大きな EXE ファイルを除けば、静的リンクで問題が発生したことはまったくありません。他の人が遭遇した欠点はありますか? 動的リンクを再度検討する正当な理由はありますか? 私のアプリは主に STL/Boost 最近 FWIW です。
c++ - リンカ エラー C++ Visual Studio 2005
直接呼び出していないメソッドに対して、Visual Studio で大量のリンカー エラーが発生しています。私は日中は Java 開発者ですが、Windows マシンで実行することを目的とした C++ で行う必要があるプロジェクトがあります。したがって、私はVisual Studioをいじっています。
基本的に、アクセサー メソッドを追加した os プロジェクトがあります。そのプロジェクトを .lib ファイルとしてコンパイルしました (コンパイルとリンクは問題ありません)。
次に、そのライブラリを使用する独自のプロジェクトを作成します。Project->Properties->Linker->Inputの下にライブラリを含め、General->Additional Lib Directoriesに適切なディレクトリを設定しました。適切なファイルにヘッダーを含めました。クラスの 1 つのコンストラクターを呼び出しているだけです...まだ作成したメソッドを呼び出していません。
コードはコンパイルされますが、次のようなリンカー エラーが山のように表示されます。ほとんどの場合、LNK2019 および LNK2001 エラーです。さまざまな設定 (lib、exe など) で再コンパイルを試みましたが、リンカ エラーが増えるだけのようです。以前の設定に戻すと、エラーの数はピークのままです。これを修正する方法はありますか?
ビルドログ
ビルド開始: プロジェクト: SpamCapture、構成: Debug|Win32
コマンドライン:
[ /VERBOSE:LIB /OUT:"C:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.exe" /INCREMENTAL /LIBPATH: "C:\SpamCapture\Config\Debug\" /MANIFEST /MANIFESTFILE:"Debug\SpamCapture.exe.intermediate.manifest" /NODEFAULTLIB:"libcmtd.lib" /NODEFAULTLIB:"nafxcwd.lib" /DEBUG /PDB:"c :\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.pdb" /SUBSYSTEM:CONSOLE /MACHINE:X86 KeyCapture_Config.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32 .lib uuid.lib odbc32.lib odbccp32.lib
".\Debug\Interaction.obj"
".\Debug\InteractionSet.obj"
".\Debug\LogReader.obj"
".\Debug\SpamCapture.obj"
".\Debug\stdafx.obj"
".\Debug\SpamCapture.res"
".\Debug\SpamCapture.exe.embed.manifest.res" ] コマンドライン "link.exe @c:\SpamCapture\SpamCapture\SpamCapture\Debug\RSP0000103081740.rsp /NOLOGO /ERRORREPORT:PROMPT" の作成
出力ウィンドウ:
リンク中... リンク: 警告 LNK4067: あいまいなエントリ ポイント。選択した 'mainCRTStartup' ライブラリを検索中 C:\SpamCapture\Config\Debug\KeyCapture_Config.lib を検索中: C:\Program Files\Microsoft Visual Studio 8\VC\lib\kernel32.lib を検索中: C:\Program Files\Microsoft Visual Studio を検索中8\VC\PlatformSDK\lib\user32.lib: 検索中 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib: 検索中 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\ lib\winspool.lib: 検索中 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib: 検索中 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib: C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib を検索中: C: を検索中
リンカー エラーはここから始まります。
KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj): エラー LNK2001: 未解決の外部シンボル "public: virtual int __thiscall CWnd::Create(char const *,char const *,unsigned long,struct tagRECT const &,class CWnd *,unsigned int,struct CCreateContext *)" (?Create@CWnd@@UAEHPBD0KABUtagRECT@@PAV1@IPAUCCreateContext@@@Z)
...このようなものをもっとたくさん
KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj): エラー LNK2019: 未解決の外部シンボル "public: struct HICON__ * thiscall CWinApp::LoadIconA(unsigned int)const " (?LoadIconA@CWinApp@@QBEPAUHICON @@I@Z) が関数で参照されています" public: __thiscall CKeyCapture_ConfigDlg::CKeyCapture_ConfigDlg(class CWnd *)" (??0CKeyCapture_ConfigDlg@@QAE@PAVCWnd@@@Z)
...このようなものをもっとたくさん
(?DoDataExchange@SetupDialog@@MAEXPAVCDataExchange@@@Z) C:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.exe: 致命的なエラー LNK1120: 34 の未解決の外部
結果:
ビルド ログは "file://c:\SpamCapture\SpamCapture\SpamCapture\Debug\BuildLog.htm" SpamCapture に保存されました - 44 個のエラー、1 個の警告
windows - Windows DLLがアプリケーションからインポートするシンボルを制御するにはどうすればよいですか?
MSVC 6(レトロ!)を使用してWindowsで共有ライブラリ(DLL)を構築しようとしていますが、解決する必要のある固有のリンクの問題があります。共有ライブラリは、読み込み中のアプリケーションによって制御されるグローバルな状態にアクセスする必要があります。
大まかに言って、私が持っているのはこれです:
application.c:
shared_library.c:
(更新-その部分を忘れました__declspec(dllexport) int __stdcall
が、実際のコードにあります)
shared_library_method
エクスポートおよびインポートするようにshared_library.dllを設定するにはどうすればよいuse_private_value
ですか?
A)私は一般的にUNIXプログラマーであり、B)VisualStudioなしでこれを行っていることを覚えておいてください。自動ビルドインフラストラクチャは、makefileを使用してMSVCを駆動します。質問に答えやすくするために省略している場合は、コメントしてください。できるだけ早く更新します。
c++ - std::exception::_Raise および std::exception::exception での VC++ リンカ エラー
Visual C++ 2005 Express Edition を使用していますが、次のリンカ エラーが発生します。
生成されたコードで例外をオフにし、ベクター ヘッダー ファイルをインクルードする前に使用しています。
いくつかのGoogleの結果はいくつかのものを示しましたが、「ああ!」はありませんでした。私のために働いた解決策。
編集:
前述のように、「_HAS_EXCEPTIONS 0」自体は例外をオフにしません。少なくともベクターヘッダーファイルでは、C++の「スロー」を呼び出す代わりに、例外オブジェクトで_Raiseを呼び出します。私の場合、正しいライブラリを含めていないため、例外オブジェクトの _Raise 関数にリンクできません。ただし、そのライブラリが何であるかは明らかではありません。
c - コンパイル ガードが複数の定義のインクルードを防止しないのはなぜですか?
複数の *.c ソース ファイルに含まれるヘッダー ファイル xh があります。このヘッダー ファイルには、いくつかの構造変数が定義されています。
次のように、ヘッダー ファイルの先頭に複数の包含防止ガードを配置しました。
ビルド時に、複数の定義に関連するリンカー エラーが発生します。私は問題を理解しています。
私が持っているように、ヘッダー ファイルの上部にある複数のインクルージョン防止ガードは、ヘッダー ファイル xh の複数のインクルードを防ぎ、それによって xh にある変数の複数の定義を回避しませんか?
#pragma
この特定のコンパイラでは一度は機能しません。解決策は何ですか? 誰かがこの回答を同様の質問に投稿しました。私にはうまくいかないようです。このソリューションはどのように機能しますか?
c++ - C++ : libA-XYZso ではなく libA.so に対してリンクする方法
私が開発したライブラリAがあります。これをマシンにデプロイすると、対応するlibA.soとlibA-XYZsoが /usr/lib (XYZ はバージョン番号) に配置されます。
ここで、A を使用するライブラリ B を開発します。B をリンクするときは、フラグ -lA を使用します。次に、「ldd libB.so」は私に与えます:
私の問題は、A の新しいバージョン (XYZZ) をリリースするときに、B の新しいバージョンもリリースする必要があることです。そうしないと、最新の A をインストールする誰かが、バージョン XYZ を探す B をインストールできなくなります。存在しません。
この問題を解決するにはどうすればよいですか? B に libA-XYZso ではなく libA.so を探すように指示するにはどうすればよいですか? それともそうするのは間違っていますか?安全ではない?
更新 1 : ライブラリ A (他の誰かから継承したもの) は autotools を使用します。
更新 2 : ライブラリ A をビルドすると、「-Wl,-soname -Wl,libA-0.6.1.so」が表示されます。私が正しく理解している場合、それは soname をlibA-0.6.1.soにすることを強制していることを意味します。そうですか?今私の問題は、autotools を使用するプロジェクトでこの動作を変更する方法がわからないことです。しばらくグーグルで検索しましたが、有用な情報が見つかりません。configure.in または Makefile.am を変更する必要がありますか?
c++ - VC++2008でSTLport-5.1.4を参照するアプリをコンパイルするときのLNK2001エラー
長い投稿をお詫び申し上げます...
以前は、VSメニュー>ツール>オプション> VC++ディレクトリ>インクルードおよびライブラリファイルのディレクトリの下にSTLPortインクルードおよびライブラリディレクトリをリストしたときに、VC ++ソリューション(VS 2008を使用)を構築できました。ただし、.vcprojファイルと.slnファイルに完全に依存するビルドプロセスに移行したかったのです。これらは、各開発PCで個別に構成する必要があるVSオプションとは異なり、ソース管理にチェックインできます。ほとんどのライブラリの移行は、各プロジェクトのプロパティページ>構成プロパティ> C / C++>一般>追加のインクルードディレクトリにインクルードディレクトリを追加し、リンカー>一般>追加のライブラリディレクトリにライブラリディレクトリを追加することで処理しました。
残念ながら、このアプローチはSTLPortでは機能しません。リンク中にLNK2019およびLNK2001エラーが発生します。
これは、実行可能プロジェクトをライブラリプロジェクトである依存関係にリンクしているときに発生します。不思議なことに、これはライブラリプロジェクト自体をリンクしている間は発生しません。何か案は?
c++ - iostream リンカ エラー
C++ コードと結合したい古い C コードがいくつかあります。
以前の C コードには、次のインクルードが含まれていました。
今、私は次のように iostream で C++ を使用しようとしています:
しかし、コンパイル時に次のリンカ エラーが発生し続けます。
[リンカ エラー] `std::string::size() const' への未定義の参照
[リンカ エラー] `std::string::operator[](unsigned int) const' への未定義参照
[リンカ エラー] `std::string::operator[](unsigned int) const' への未定義参照
[リンカ エラー] `std::string::operator[](unsigned int) const' への未定義参照
[リンカ エラー] `std::ios_base::Init::Init()' への未定義の参照
[リンカ エラー] `std::ios_base::Init::~Init()' への未定義の参照
ld は 1 つの終了ステータスを返しました
これを解決するにはどうすればよいですか?
編集: 私のコンパイラは Dev-C++ 4.9.9.2 です
c++ - アーカイブの代わりにg++部分リンク?
私はC++ビルドフローにかなり慣れていないので、ar
アーカイブを作成する代わりに、ライブラリに部分的なリンクを使用するように切り替えることを考えています。私が持っている必然的な最終コンパイルステップでリンク時間を短縮したいと思っています。一部のライブラリを一度部分的にリンクすると、その最終ステップですべてをリンクするよりも時間を節約できると思います。
私が説明していることは可能ですか?私はそれが線に沿った何かであるべきだと思いますld -Ur -o mylib.o [components]
。私が考慮していない重要なビルドの考慮事項はありますか?