2009-04-01 25 views
0

を結ぶ私はC++ ...私は別のソースにCでいくつかの機能を宣言しようとしているC++関数エラーの複数の宣言

を忘れて、必要なときに適切な.hを含めているように見えます。それはOKをコンパイルします。リンカーがすでに定義されている機能について不平を言うリンク中に問題が発生します。

私はさらに、関数を宣言して実装を.cでのみ実現しようとすると、関数をexternとして定義しようとしました。

これは私のコードの簡略説明です:

COMMON.H

#include <stdio.h> 

module1.h

#include "common.h" 
#ifndef MODULE1_H_ 
#define MODULE1_H_ 
int init(int option); 
int open(char* db, char* username, char* password); 
int get(int handler, int date[2], int time[2], int* data, int& rowsize, int& numrows); 
int put(int handler, int* data, int& datasize, int& numrows); 
int close(int handler); 
int finalize(); 
#endif /* MODULE1_H_ */ 

module2.h

#include "common.h" 
#ifndef MODULE2_H_ 
#define MODULE2_H_ 
int get1(int handler, int date, int time, int *data, int& datasize, int& rowsize); 
int put1(int handler, int* data, int datasize); 
#endif /*MODULE2_H_*/ 

module1.cpp

#include "module1.h" 
int init(int option) { ... } 
int finalize() { ... } 
int get(int handler, int date[2], int time[2], int* data, int& rowsize, int& numrows) { 
    .... 
} 
... 

module2.cpp

#include "module1.h" 
#include "module2.h" 
int get1(int handler, int date, int time, int* data, int rowsize) { 
    int daterange[2]={date,date}; 
    int timerange[2]={time,time}; 
    int rsize, numrows, result; 
    result=get(handler, daterange,timerange, data, rsize, numrows); 
    rowsize=rsize; 
    if(numrows!=1) printf("Uh oh...\n"); 
    return result; 
} 
... 

&コンパイルリンケージ:

g++ -o module1.o -c module1.cpp 
g++ -o module2.o -c module2.cpp 
g++ -fPIC -shared -o library.so module1.o module2.o 

私が言ったように、それはOKをコンパイルします。問題はリンケージ中です。リンカは、module1.hの2つの実装された関数があると見ています:module1.hを含むものからmodule1.cppに含まれています。もう1つはmodule1.hと一緒にmodule2.hと一緒にmodule2.cppに含まれています。

私は関数が宣言されるはずであることは知っていますが、私は明らかにfaux-pasをやっています。 誰かがそれがどこであるかを指摘できますか?前もって感謝します。

+0

実際のエラーメッセージをリンカーから含めてください。 – SoapBox

+0

質問に特定のリンカーエラーメッセージを追加することをお勧めします。関数名が組み込み関数と競合する可能性があります。 –

+0

実際のコードを "include/ifx2f.h:215"から投稿し、そのヘッダの複数のインクルードガード –

答えて

0

はあなたの回答やコメントありがとうございました。私は問題(それは非常にばかげたものであることが分かった)を把握し、解決に近づいていた(うまくいけば)。

FortranでC関数呼び出しを使用するためのレイヤーを実装している別のインクルードファイル(cfortran.h)から導かれています(逆も同様です)。これは非常に便利で、私はこれまで成功してきましたが、私はエラーによって "盲目"になっていました。そのインクルード文書には、C言語ではなくC言語での使用に注意が必要だと述べられていますが、これが実際に警告を出す最初の例です。

ありがとうございました。

+0

つまり、この問題はcfortran.hの使用に起因します。私がそれを放置すると、コンパイルとリンケージは問題なく起こります。 – jbatista

3

関数名を変更する必要があります。あなたが言及したそれらの名前(例:open)のいくつかにはすでに関数があり、それらはおそらくあなたがリンクしているものに含まれているでしょう。

+0

"open"は単なる例です。私のプロジェクトでは "ifxopen"と呼ばれています。 「すでに関数があります...」と言われると、それらが「標準」関数であるということですか、それとも、この特定のプロジェクトの名前衝突ですか? – jbatista

+0

正確なリンクエラーは何ですか?関数 'ifxcount_で –

+0

例:/ ifx4cldb.o
SRC ':215:' ifxcount_の複数定義
は/ ifx2f.h含む'
SRC/ifx2f.o:含める/ ifx2f.h:215:最初ここに定義されています – jbatista

1

やあ、

あなたはこれをextern 12月を使用してCおよびC++ではないであることをコンパイラとリンカに指示する必要がありますしないでください。?

extern "C" { 
    #include "my_bits_of_C.h" 
} 

リンガーには、名前のマングリングが起こっていないことを知らせますか?

HTH

歓声、