4

これは非常に基本的な問題であり、現時点で私を苛立たせています。たとえば、1 つのソリューション内に 2 つのプロジェクトがあるとします。最初のプロジェクトを SimpleMath と呼びましょう。ヘッダーファイル「Add.h」が1つあります。

int add(int i, int j)

そして実装「Add.cpp」は

int add(int i, int j) {
  return i+j;
}

次に、2 番目のプロジェクトで add 関数を使用するとします。ただし、このコード:

#include "..\SimpleMath\Add.h"

int main() {

    add(1, 2);

}

「未解決の外部シンボル」になります。2 番目のプログラムに .cpp ファイル内の実際の実装について「認識」させるにはどうすればよいですか。補足として、すべてのコードは架空のものであり、これは私が実際にプログラムする方法ではありません。

4

6 に答える 6

6

CライブラリをC++プロジェクトにリンクしようとしている場合は、次のようなことを行う必要があります。

extern "C" {
    #include "..\SimpleMath\Add.h"
}

CとC++は異なるシンボル名を使用するため。

于 2009-07-30T14:34:28.707 に答える
6

取得しているエラーの理由は、ヘッダー ファイルを含めることで、シンボルがあることをコンパイラに伝えているためです。

int add (int, int)

これはリンケージ中に存在しますが、実際にはそのシンボル (関数のコード) をプロジェクトに含めていません。問題を解決する簡単な方法は、単純に Add.cpp を両方のプロジェクトに追加することです。しかし、「良い」解決策は、プロジェクト プロパティのプロジェクト タイプを変更して、SimpleMath をアプリケーションではなくライブラリにすることでしょう。

ところで、おそらく、そのヘッダー ファイルが複数インクルードされるのを防ぐために、何らかのメカニズムが必要になるでしょう。私は通常#pragma once、Visual C++ に固執する場合はこれで問題ないはずですが、完全に移植可能ではない可能性があるため、移植性が必要な場合は、ヘッダー ファイルを#ifndef-blockでラップするという従来のアプローチを使用します。

#ifndef __ADD_H
#define __ADD_H

int add (int i, int j);

#endif

幸運を。

于 2008-10-09T08:42:07.817 に答える
3

Add.cpp をライブラリの一部にして、両方のプロジェクトに含める必要があります。または、Add.cpp を 2 番目のプロジェクトにも追加する必要があります。

編集: SimpleMath をライブラリにするには、[一般] のプロジェクト設定に入り、[構成タイプ] を [静的ライブラリ] に変更します。

次に、ソリューション設定に移動し、[プロジェクトの依存関係] をクリックして、ドロップダウン リストで 2 番目のプロジェクトを選択し、SimpleMath の横にチェック マークを付けます。これにより、SimpleMath が 2 番目のプロジェクトに自動的にリンクされ、2 番目のプロジェクトを再構築するときに SimpleMath への変更が再構築されるようになります。

于 2008-10-09T08:29:06.800 に答える
1

SimpleMath は、プロジェクト プロパティでライブラリ ファイル (.LIB) として定義する必要があります。これはアンマネージ (非 .Net) C++ であると想定しています。次に、もう一方のプロジェクトに SimpleMath.lib を含めます。

于 2008-10-09T08:31:12.660 に答える
0

同じプロジェクト内でこの問題が発生しました...コードをよく見ると、関数を呼び出そうとするコードがインターフェイスを使用していることに気付きました (純粋な仮想メソッド呼び出し = 0 を介して)。しかし、インターフェイス クラスと実装クラスに「仮想」という言葉を追加するのを忘れていました。「仮想」を追加すると、問題は解決しました。

于 2011-12-12T09:42:34.770 に答える