0

オブジェクトファイルをコンパイルしてからそれらをリンクすることでプロジェクトをコンパイルしようとしていますが、特別なことは何もありません。

hello.o : hello.h hello.cu
    nvcc hello.cu -c -o hello.o
#...
main.o : $(objs)
    nvcc *.o -o exec

リンクフェーズに入ると、nmがそれぞれが実際にオブジェクトファイル内にあり、それらの名前が壊れていないことを示しているにもかかわらず、ほぼすべてのメソッドが欠落していて宣言されていないことが示されています。ここで何が起こっているのですか?

4

3 に答える 3

1

あなたの最終的なmakeターゲットは偽物に見えます:それは言うべきではありません:

exec : $(objs)
    nvcc $(objs) -o $@

コマンドラインにCUDAライブラリを追加する必要がある場合もあります(ファイルを直接nvccコンパイルするときにこれがわかると思いますが、.cuファイルを指定するだけではうまくいかない場合があり.oます)。だから、もっとこのようなもの:

exec : $(objs)
    nvcc $(objs) -o $@ -lcuda -lcudart -lcublas

(正確に必要なライブラリはコードによって異なります)

于 2010-07-08T06:54:04.717 に答える
0

さて、私の質問の定式化は正しくありませんでした。実際、問題は私が次のようにCコードをコンパイルしていたことでした。

hello.o : hello.h hello.cu
    nvcc hello.c -c -o hello.o
#...
main.o : $(objs)
    nvcc *.o -o exec

これにより、nvccは.cファイルをgccに渡しました。メソッドの名前として「nm*.o」をgrepしたとき、gccによって発行されたオブジェクトファイルにはマングルされていない名前があり、g++によってコンパイルされた.cuファイルはマングルされた名前を予期していることがわかりました。

私の解決策は、プロジェクト内のすべての.cファイルの名前を.cuに変更することでしたが、(テストはしていませんが)それらを.cのままにして、makefileで明示的にg++を呼び出すだけで十分だと思います。

于 2010-07-10T17:44:05.850 に答える
0

g ++を呼び出してみましたが、同じエラーが発生しました。答えはここで見つかりました:

http://forums.nvidia.com/index.php?showtopic=190973&st=0&gopid=1179661&#entry1179661

つまり、関数プロトタイプは正しい必要があります。

于 2011-01-19T11:58:00.537 に答える