1

重複の可能性:
CからC ++で書かれたlibを呼び出す方法は?

pHashをいじくり回していて、ファイルの場所から知覚ハッシュを生成する関数を呼び出したいと思います。ph_dct_imagehashという関数を呼び出そうとすると、コンパイラは次のエラーをスローします。

/usr/include/CImg.h:72:18: fatal error: cstdio: No such file or directory
compilation terminated.

この時点で、pHashはC ++で記述されているため、CプログラムにC++ヘッダーを含めることはできません。それにもかかわらず、関数自体は、パラメーターも戻り値もC ++構造を使用していないため、Cから呼び出すことができるはずです。CからC++関数ph_dct_imagehashを呼び出す良い方法はありますか?

注:私は主にC(C ++ではなく)を上達させるためにこれを行っています。これが私が自分自身をCに制限している理由です。

4

3 に答える 3

5

呼び出すシンボル名がマングルされていない限り、C++ライブラリをCプログラムに非常に簡単にリンクできます。Cセーフヘッダーファイルまたはその他の方法で関数名を前方宣言し、最後にリンクするだけです(C ++対応のリンカーを使用してください)。

簡単な例を次に示します。

$ cat cplusplus.cpp 
#include <string>

extern "C"
const char *cplusplusFunction(void)
{
    static std::string a = "Hello, C++";
    return a.c_str();
}
$ cat example.c 
#include <stdio.h>

const char *cplusplusFunction(void);

int main(void)
{
    printf("%s\n", cplusplusFunction());
    return 0;
}
$ c++ -c -o cplusplus.o cplusplus.cpp
$ cc -c -o example.o example.c 
$c++ -o example example.o cplusplus.o
$ ./example 
Hello, C++
于 2012-12-21T22:23:34.503 に答える
2

C++コード関数をCコードから分離する必要があります。

通常、これは、問題を解決するために必要な関数とCデータ構造のC(C ++ではない)宣言のみを含む.hファイルと、CからC++へのインターフェイス関数を含むC++ファイルを使用して行われます。

また、使用する必要があります

#ifdef __cplusplus
extern "C" {
#endif
.... your types and functions ... 
#ifdef __cplusplus
}
#endif

ヘッダーファイルで、C ++コンパイラが名前を「マングル」しないようにするため(関数の名前にパラメータのタイプをマークする、たとえば関数Blur(int x、int y)は_Blur_iiと呼ばれる場合があります。 Cはこの種の「余分なもの」を関数名に追加しないため、Cコンパイラは_Blurを呼び出します。もちろん、リンクしようとすると、リンカーは「_Blurが見つかりません」と表示します。

編集:さらに、Cコードに「漏れる」例外がないことを絶対に100%確認してください。そうした場合、何かが起こる可能性があり、それは通常、空から落ちる金ではなく、いくつかの悪いものです... :)

于 2012-12-21T22:28:39.950 に答える
0

C ++コンパイラ(gccではなくg ++など)を使用している場合は、CコードからC ++コードをシームレスに呼び出すことができ、すべてが正常に機能します。これは、本当に奇妙なことをしているのでない限り、CはC++に含まれているためです。

また、g ++でコンパイルしても機能しない場合は、ファイル拡張子を.cから.cc、.cpp、.cxxなどに変更する必要があります。できれば.cc

于 2012-12-21T22:26:27.437 に答える