VS2010 の C と C プロジェクトが混在するリンカー エラーを解決する
問題の説明
C コードを異なる VS2010 プロジェクトの C プロジェクトに統合すると、 C コードから C 関数を呼び出すときにリンク エラーが発生する。このエラーは LNK2001 として識別され、未解決の外部シンボルに関連しています。
解決策
この問題を修正するには、次の特定のガイドラインに従ってコードベースが適切に構成されていることを確認します。
-
モジュール化コード:
- 各 C モジュールは 1 つのヘッダー ファイルと 1 つのソース ファイルで構成される必要があります。
- ファイルとマクロの両方の命名規則の一貫性を維持します。
-
ヘッダーの作成と実装ファイル:
- ヘッダー ファイル (functions.h など) で関数を定義し、ソース ファイル (functions.c など) で実装します。
-
エクスポートとインポート:
- FUNCTIONS_EXPORT_API マクロを使用して、ヘッダー ファイル内でエクスポート (またはインポート) する関数をマークします。
- 関数を使用するプロジェクトにヘッダーを含める場合、 FUNCTIONS_EXPORT_API を定義しないでください (または、インポート値を使用してマクロを定義します)。
- 必ず確認してください。関数をエクスポートするプロジェクトには、ヘッダーを含める前に (自動または手動で) FUNCTIONS_EXPORT マクロが定義されていること。
例コード
functions.h
<code class="c">#pragma once
#define FUNCTIONS_EXPORT_API
#if defined(__cplusplus)
extern "C" {
#endif
FUNCTIONS_EXPORT_API char *dtoa(double, int, int, int*, int*, char**);
FUNCTIONS_EXPORT_API char *g_fmt(char*, double);
FUNCTIONS_EXPORT_API void freedtoa(char*);
#if defined(__cplusplus)
}
#endif</code>
ログイン後にコピー
functions.c
<code class="c">#define FUNCTIONS_EXPORTS
#include "functions.h"
char *dtoa(double, int, int, int*, int*, char**)
{
// Function implementation
}
char *g_fmt(char*, double)
{
// Function implementation
}
void freedtoa(char*)
{
// Function implementation
}</code>
ログイン後にコピー
追加の考慮事項
- 内部の関数宣言で extern ストレージ指定子を使用しないでください。ヘッダー。
- プロジェクト固有のマクロ (EXPORTFUNCTIONSPROJECT_EXPORTS など) を利用してエクスポートを自動化します。
- プリプロセッサ定義のプロジェクト プロパティでマクロ名を確認します。
関連問題
- [CLR Windows フォームの LNK2005 エラー](https://stackoverflow.com/a/17362530/1128974)
- [Excel VBA、DLL エントリ ポイントが見つかりません] DLLからファイル](https://stackoverflow.com/a/7214325/1128974)
- [ライブラリで fstream を使用すると、実行可能ファイルでリンカー エラーが発生します](https://stackoverflow.com/a/10068252 /1128974)
- [C dll エクスポート未定義](https://stackoverflow.com/a/7709927/1128974)
以上がVS2010 の C プロジェクトと C プロジェクトが混在している場合の LNK2001 リンカー エラーを解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。