0

私は DNA フラグメント アセンブリ プログラムに取り組んでいます。CPU のみのバージョンは GCC を使用して C 言語でビルドされており、NVCC を使用して GPU バージョンをビルドしようとしています。

ここにメイクファイルがあります

all : clean FragmentAssembly.exe

FragmentAssembly.exe : Common.o Fragment.o ILS.o Consensus.o main.o
    nvcc -pg -o FragmentAssembly.exe Common.o Fragment.o ILS.o Consensus.o main.o 

Common.o : Common.cu
    nvcc -pg -o Common.o -c Common.cu

Fragment.o : Fragment.cu
    nvcc -pg -o Fragment.o -c Fragment.cu

ILS.o : ILS.cu
    nvcc -pg -o ILS.o -c ILS.cu

Consensus.o : Consensus.cu
    nvcc -pg -o Consensus.o -c Consensus.cu

main.o : main.cu
    nvcc -pg -o main.o -c main.cu

clean : 
    rm -f *.exe *.o

ご覧のとおり、元のファイルは、正しくコンパイルする.cために .cu ファイルになりました。nvccすべての cu ファイルには、対応するファイル (Common.cu の Common.h など) が含まれていますmain.cu

ILS.h には、グローバル変数の定義が含まれp_instanceFragmentsており、p_instanceLength

問題は、NVCC をコンパイルするときに、不明な理由で次のエラーが発生することです。

Consensus.o:(.bss+0x0): multiple definition of `p_instanceFragments'
ILS.o:(.bss+0x0): first defined here
Consensus.o:(.bss+0x8): multiple definition of `p_instanceLength'
ILS.o:(.bss+0x8): first defined here

同じコードが GCC を使用して正しくビルドされるため、実際の複数の定義はありません。と によって、ILS.hが nvcc に 2 回含まれているように見えます。複数のインクルードと無限のインクルード ループを避けるために、すべてのヘッダー ファイルをステートメントでラップしたため、これも不可能です。ILS.cuConsensus.cu#ifndef .. #define .. #endif

多分makefileコマンドで何か?または、リンクにgccを使用する必要がありますか? 対処方法を教えてください。

よろしく、

4

1 に答える 1