2011-01-05 6 views
3

私はオープンソースコード(pngcrush)を変更していて、いくつかのC++ヘッダー(fstream、iostream)を含めたいと思っています。cベースのコードのC++ヘッダー(fstream)が含まれていますか?

このようなファイルはありません。
どのようにそれらを含めることができますか?使用して(私はCコードとして、それをコンパイルすることになった

-

は、第二編集

-EDIT-

adler32.c:60: error: ‘uLong adler32’ redeclared as different kind of symbol 
zlib.h:1469: error: previous declaration of ‘uLong adler32(uLong, const Bytef*, uInt)’ 
adler32.c:60: error: ‘adler’ was not declared in this scope 
adler32.c:60: error: ‘buf’ was not declared in this scope 
adler32.c:60: error: ‘len’ was not declared in this scope 
adler32.c:64: error: expected unqualified-id before ‘{’ token 
adler32.c:12: warning: ‘uLong adler32_combine_(uLong, uLong, long int)’ declared ‘static’ but never defined 
make: *** [adler32.o] Error 1 

Compilation exited abnormally with code 2 at Wed Jan 5 18:51:02 
コードで

uLong ZEXPORT adler32(adler, buf, len) 
    uLong adler; 
    const Bytef *buf; 
    uInt len; 
{ 
    unsigned long sum2; 
    unsigned n; 
  • ありがとうgcc)bu #ifdef __cplusplus extern "C" {} #endif .. #ifdefをプロジェクトの他のCコードの後に​​置きます。

    それは今コンパイルが、私は私のCにこのlibpngcrush.aをリンクするときに警告して、また

    ar rcs libpngcrush.a png.o pngerror.o pngget.o pngmem.o pngpread.o pngread.o pngrio.o pngrtran.o pngrutil.o pngset.o pngtrans.o pngwio.o pngwrite.o pngwtran.o pngwutil.o adler32.o compress.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o simplepngcrush.o 
    /usr/bin/ranlib: file: libpngcrush.a(pngpread.o) has no symbols 
    

    (RANLIBが何のシンボルを持っていない、私はそれが唯一のMac OSに起こるように見える、それをGoogleで検索)++コード、
    初めてライブラリにある関数を呼び出すと死んでしまいます。

    Run till exit from #0 0x0000000100089071 in simplepngcrush() at tokenlist.h:118 
    
    Program received signal EXC_BAD_ACCESS, Could not access memory. 
    Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000000 
    0x00000001000890f8 in simplepngcrush() at tokenlist.h:118 
    

    私は、呼び出された関数の最初の行にも到達できません。

答えて

5

できません。 C++ソースコードをCから使用することはできません。

唯一の方法はC++に変換することです:C++でコードを変換する(これはしばしばコードの変更を必要とせず、コンパイルを切り替えるためのビルドスクリプトのみ)、C++ヘッダーとツールを使用します。


EDIT:

C++シンボル(関数、変数、およびもの)を識別するために、Cとは異なる方法を使用します。

uLong ZEXPORT adler32(adler, buf, len)はCによってadler32と呼ばれ、C++では_Z7adler32lPKciと呼ばれることがあります。これは、オーバーロードのようなものを提供することです。

あなたは、コンパイラはそれをCが与える同じ名前を与えてみましょうするためにあなたがextern "C"に宣言を置くことができますしたい場合:

extern "C" 
{ 
    uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len); 
} 
+0

感謝..このCコードでは動作していないようですが、私はchangec CC = g ++ LD = g ++でした。編集 – eugene

+0

私の答えを更新しました。 – peoro

+0

おっと、はい、この例のように定義してください、ごめんなさい! - fixed – peoro

3

私はそれに対して助言します。プロジェクトがC言語で記述されている場合は、C言語で記述し、FILE *やprintfなどを使用してください。

C++とCを統合していて、どちらかを使用したい場合には違いがあります: - C++でモジュールを作成します。それはCインタフェース - モジュールをC++で記述し、Cインタフェースを呼び出します。

iostreamにCインターフェイスを与えることで、fstreamをCに公開することはできますが、実際には大きな利点はありません。たとえば、ストリーミングアウト機能を過負荷にすることはできません(つまり、異なる名前で同じ名前を使用している場合)。

あなた自身のライブラリではありますが、C++で記述してCインタフェースを提供したいと思うかもしれません。そのような場合には、クラスの前方宣言(構造体を呼び出す)と、ポインタを使用してアクセスするフリー関数を使用します(もちろん、Cには参照がありません)。

ユーザは常にあなたのクラスへのポインタを扱いますが、もちろん彼らはそれらを処分するための関数を必要とします(彼らは無料で呼び出すだけではありません)。

+0

そして正しい呼び出し規約を強制するために関数上で 'extern" C "'を忘れないでください。 –

+0

Cのヘッダーにextern "C"を入れる必要はありません.C++から呼び出すときにのみ行うので、C++はヘッダーの#includeの前にextern "C"を使用できます。多くの場合、__cplusplusの定義に基づいてプリプロセッサコマンドを使用します – CashCow

1

あなたはしません。コードがCの場合は、C++ヘッダーを投げ込んで動作させることはできません。 CとC++は2つあります。はそれぞれです。

代わりに、C++での全体の構築に移ります。これは、記述方法に応じて、コードベースの変更を伴います。

(これらのヘッダーを使用できる唯一の方法です。代わりに、C言語で書かれている場合はCに固執してください。元のコードベースで維持可能です。 )

2

あなたのCコードは、そうあなたはまたに可能性のあるC

からC++ライブラリを使用する方法がないなど、クラス、テンプレートのようなものを認識し、新規、削除されませんCコンパイラでコンパイルされますより厳しい型のシステムのためにC++としてCコードをコンパイルしようとすると、エラーが発生します。また、あなたの同僚はCモジュールをC++に変換することに感謝しないかもしれません。

CファイルioとCストリームを使用して目標を達成しようとします。ファイル、fopen、fread、fwrite、fprintf、stdout、stderrなど