私は 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.cu
Consensus.cu
#ifndef .. #define .. #endif
多分makefileコマンドで何か?または、リンクにgccを使用する必要がありますか? 対処方法を教えてください。
よろしく、