1

CプロジェクトにいくつかのCUDAコードを含めようとしています。これを行うために、CUDAソース(.cuファイル)を静的ライブラリ(.lib、Windowsで開発中)にコンパイルしています。次に、この静的ライブラリをCプロジェクトにリンクしたいと思います。しかし、私のリンカはこのステップについて不平を言っています、そしてそれはC /C++リンケージの問題のためだと思います。私が得ている特定のエラーは次のようになります。

 Undefined symbol '_cudaMallocHost@8' referenced in "cufft object file.lib".

私はCUDA5.0を使用しており、Visual Studio 10で作業して、Windows7マシンでCUDAソースを作成およびコンパイルしています。

まず、静的ライブラリ( "cufft object file.lib")にコンパイルする.cuソースファイルがあります。全部をで包みましたextern C { }。これは次のようになります。

extern "C" {

#include <cuda.h>
#include <cufft.h>

int myCUDAfunction()
{
    //Some CUDA code
}

}

これに合わせて、.cuソース( "myCUDAheader.h")で定義された関数のリストを含むヘッダーファイルを作成しました。このファイルの内容は、一連の関数プロトタイプにすぎません。

int myCUDAfunction();

最後に、Cプロジェクトに静的ライブラリを追加し、ヘッダーファイルをインクルードします。

CUDAソース.cuファイルで関数をで宣言し始める前にextern "C"、リンカーはそれらの関数のシンボルが欠落していると不平を言いました。これらは現在Cリンケージに正しくコンパイルされている必要がありますが、実際のCUDA関数(などcudaMalloc)はまだC++リンケージを持っているようです。これを回避するにはどうすればよいですか?

4

2 に答える 2

6

CUDAライブラリのリンクを変更することはできませんが、変更する必要もありません。したがって、この:

extern "C" {

#include <cuda.h>
#include <cufft.h>

int myCUDAfunction();

.....

}

おそらくそうではないのに、CUDAランタイムライブラリにはCリンケージがあると宣言しているので、間違っています。これは正しいでしょう:

#include <cuda.h>
#include <cufft.h>

extern "C" {

int myCUDAfunction();
.....

}

この方法myCUDAfunctionにはCリンケージがあり、Cツールチェーンでコンパイルおよびリンクされたコードから呼び出されたときにリンクします。これを行うことの全体的なポイントは CUDAコードとそれが呼び出すライブラリ関数にC呼び出し可能なラッパー関数を提供することです。そうすれば、CコードはCUDAコードのC++基盤を完全に知らない可能性があります。

于 2012-12-21T16:11:24.287 に答える
2

CUDAヘッダーとリンクされたcudart.libをCアプリケーションに含めましたか?そうでない場合は、静的ライブラリに実際のCUDAライブラリの実装が含まれないため、おそらくこれを行う必要があります。また、それらをリンクする順序も重要だと思います。それがあなたのライブラリであるか、cudart.libであるか、またはその逆であるかを頭から思い出せません。最悪の事態が発生した場合は、CプロジェクトをCUDAプロジェクトとして設定する必要があります。

于 2012-12-21T15:28:13.350 に答える