2017-03-07 9 views
1

私はメインのコードウィッヒは、いくつかのライブラリを使用して持っていると私はこのようにそれをコンパイルされて:今、私は私がコンパイルできるか、mainCodeでCUDAコードを追加して.cuために、その拡張子を変更し...だからいるCヘッダとCUDAコードでCコードをコンパイルするには?

gcc importedCFile1.c importedCFile2.c mainCode.c -O3 -lm -Wall -o maincode -lrt 

全部?

私が試した:

nvcc importedCFile1.c importedCFile2.c mainCode.cu -o maincode 

を私はインポートされたCファイルで私の機能に「未定義の参照」の多くを得ました。

extern "C" { 
    #include "importedCFile1.h" 
    #include "importedCFile2.h" 
} 

そして'importedCFile1.c'が'importedCFile2.c'と'mainCode.cu'で宣言されたいくつかの関数と変数を使用している:私は使用しています私のCファイルをインクルードする

このように:

extern int **se;  // Variables from mainCode 
extern int *n;   
extern int numNodes; 

extern int *getVector(int n); // Function from mainCode 
extern int iRand(int high);  // Function from importedCFile2 

この関数は未定義の参照の原因です。私は何をすべきか?

また、-lrtO3lmWallなど、Cコードに必要なフラグを追加するにはどうすればよいですか?

EDIT:あなたはここでの問題の減少例を見つけることができます:あなたはgccでmainCode.cとimportedCFile.cをコンパイルする場合

https://github.com/mvnarvaezt/cuda/tree/master/minimalExample

はそれが正常に動作します。 mainCode.cuとimportedCFile.cをnvccでコンパイルすると、anExample()(importedCFile.cの関数)への未定義のリファレンスが得られます。

あなたは、ヘッダーにimportedCFile.cをインポートし、それが動作するanExampled()関数の呼び出しをコメントします。

+0

ヘッダファイルに 'extern" C "{#include ...}'を含めてラップします。さもなければ、関数名はC++規則に従ってマングルされます。 – tera

+0

@teraでしたが、'importedCFile1.c 'では'importedCFile2.c'と'emainCode.cu 'の関数と変数も使用されていますが、それらには "未定義参照"があります。 私は'importedCFile1.c 'のようなものを持っています: extern int * getVector(int n); //これはmainCode.cuの関数です extern int iRand(int high);これはmainCode.cuの関数です。 //これはimportedCFile2.cの関数です – user3117891

+2

これはうまくいくはずです。問題を示すためのコードをいくつか示してください。 – tera

答えて

1

あなたの問題は、importedFile.cのCコードがmainCode.cuのC++関数を呼び戻そうとしていることです。

Cから呼び出すには、C++関数にCリンケージが必要です。 mainCode.cuにgetVector()

として
extern "C" int *getVector(int n) { 

を宣言し、そしてあなたの例では罰金コンパイルします。

+0

それは働いた!私はとても感謝しています。あなたの助けをありがとう! – user3117891

関連する問題