2017-04-04 18 views
-2

CUDAファイルを含むプログラムをコンパイルしようとするとエラーコードLNK2019が表示されますが、コードの先頭に関連するヘッダーファイルが含まれています。未解決の外部シンボル_parallel_managerが関数_mainで参照されています

私が有効ではありません(リンカエラーを取り除く)1つのファイルにこのプログラムですべてを含むようにするために十分に簡単だった以前のプログラムで

#ifndef parallel_functions_cuh 
#define parallel_functions_cuh 

void 
parallel_manager(image_chunk ***image_grid, network_chunk *** network_grid); 

#endif 

:全くの構成されてい

#include "parallel_functions.cuh" 

オプション。

CUDAでこの特定のエラーが検出される唯一の参考資料はthis prior questionですが、そのソリューションは既に適用されており、すべてのライブラリが含まれています。

launch.c、kernel.cu、kernel.cuhからなる単純なプロジェクトでも同じエラーが発生します。

launch.c:

#include "kernel.cuh" 

void main() 
{ 
    parallel_function(); 
} 

kernel.cuh:

#ifndef kernel_cuh 
#define kernel_cuh 

void parallel_function(); 

#endif 

kernel.cu:

1>------ Build started: Project: ErrorProject, Configuration: Debug Win32 ------ 
1> launch.c 
1>launch.obj : error LNK2019: unresolved external symbol _parallel_function referenced in function _main 
1>C:\Error\ErrorProject\Debug\ErrorProject.exe : fatal error LNK1120: 1 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
0:ビルドする以下の出力が得られます

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 
#include <stdio.h> 

__global__ void kernel(char *a) 
{ 
    a[threadIdx.x] = threadIdx.x; 
} 

void parallel_function() 
{ 
    char* data; 
    cudaMallocManaged(&data, 256); 

    kernel<<<1, 256>>>(data); 
    cudaDeviceSynchronize(); 

    for (int i = 0; i < 256; i++) 
    { 
     printf("%d ", data[i]); 
    } 

    cudaFree(data); 
} 

ビルドの依存関係は、リンカ設定のツールキットの依存関係とcudart.libを含め、デフォルトのCUDA V8.0ターゲットを使用

LNK2019 unresolved external symbol _parallel_function referenced in function _main 

:さらに、これを含むエラーリストで

+0

これはリンカエラーです。 'parallel_manager'の定義を含むこのプロジェクトに追加する必要のあるファイルがいくつかあります。そうしないと、その関数のコンパイルされたバージョンを含むオブジェクトまたはライブラリに対してプロジェクトをリンクする必要があります。関数宣言を提供するヘッダーファイルを含めるだけでは、リンク時エラーを回避するには不十分です。 'parallel_functions 'というファイルがあります。現在はあなたのプロジェクトの一部ではありませんが、そうする必要があります。 –

+0

parallel_functions.cuは既にプロジェクトの一部です。 – Rain

+0

これを実証する完全な例を見る必要があるかもしれません。このヘッダーファイル、ヘッダーファイル自体、およびparallel_functions.cuファイルを含むファイルだけを削除することができます。私はあなたがいくつかの窓を持っている可能性もあると確信していますVSプロジェクトの設定も干渉している。その場合、このエラーとそれに至るすべてのコンパイルコマンドを示す完全なVSコンソール出力を提供すると、 –

答えて

0

コメントに基づいて、これはCスタイルのリンクとC++スタイルのリンクとの間の不一致であるように見えます(おそらく、未解決のシンボル自体から明らかです - mangledではないようです)。

nvccは、C++スタイルのコンパイルとリンクを使用します。 Cスタイルの機能は対応できますが、特別な処理が必要です(in many places here on the CUDA tagなど)。ここではこれを繰り返さないでください。

デフォルトでは、多くのコンパイラ(ここではホストコンパイラを含む)は、暗黙のうちにCスタイルのリンクを指定すると、.cで終わるファイル名を扱います。その結果、OPのソースファイル(launch.c)で要求された関数は、C++スタイルのリンクポイントを提供していたプロジェクトの他の場所で解決できませんでした。

この場合の解決策は、launch.claunch.cppに変更し、プロジェクト全体をC++スタイルにリンクして一貫性を保つことでした。

関連する問題