2012-05-17 32 views
7

Tôi đang làm việc trên một dự án sử dụng các tệp .c và .cu. Gói ban đầu được viết hoàn toàn bằng C và có Makefile của riêng nó (nó hoàn toàn hoạt động). Tôi đã thêm tệp .cu vào dự án và bây giờ tôi muốn sửa đổi Makefile để nó biên dịch mọi thứ lại với nhau.Makefile cho CUDA và C

Đây là nỗ lực của tôi:

CC = nvcc 

SOURCEDIR = ../sourcedir 

EXE = it 

#C_SOURCES = $(wildcard $(SOURCEDIR)/*.c) 
#CU_SOURCES = $(wildcard $(SOURCEDIR)/*.cu) 

SOURCES = $(SOURCEDIR)/it.c \ 
      $(SOURCEDIR)/em.c \ 
      $(SOURCEDIR)/art.c \ 
      $(SOURCEDIR)/cg.c \ 
      $(SOURCEDIR)/amatrix.c \ 
      $(SOURCEDIR)/itreadargs.c \ 
      $(SOURCEDIR)/sparse.c \ 
      $(SOURCEDIR)/misc.c \ 
      $(SOURCEDIR)/eval.c \ 
      $(SOURCEDIR)/imgtools.c \ 
      $(SOURCEDIR)/calc.c \ 
      $(SOURCEDIR)/egif_lib.c \ 
      $(SOURCEDIR)/dgif_lib.c \ 
      $(SOURCEDIR)/gif_err.c \ 
      $(SOURCEDIR)/gif_hash.c 

CU_SOURCES = $(SOURCEDIR)/cg_cuda.cu 

H_FILES = $(wildcard $(IDIR)/*.h) 

IDIR  = -I../include 

OBJS  = $(SOURCES:.c=.o) 
CU_OBJS = $(CU_SOURCES:.cu=.o) 

CFLAGS  = -O3 
#-finline-functions -Winline -Wall -falign-loops=2 -falign-jumps=2 -falign-functions=2 -Wstrict-prototypes 

NVCCFLAGS = -arch=sm_20 

#CFLAGS  = -g -Wstrict-prototypes -Winline -Wall 

LFLAGS  = -lm 


$(EXE) : $(OBJS) $(CU_OBJS) 
    $(CC) $(CFLAGS) $(NVCCFLAGS) -o [email protected] $? 

$(SOURCEDIR)/%.o : $(SOURCEDIR)/%.c $(H_FILES) 
    $(CC) $(CFLAGS) $(IDIR) -c -o [email protected] $< 

$(SOURCEDIR)/%.o : $(SOURCEDIR)/%.cu $(H_FILES) 
    $(CC) $(NVCCFLAGS) $(IDIR) -c -o [email protected] $< 


clean: 
    rm -f $(OBJS) $(EXE) 

Cấu trúc của dự án như sau:

  • Dự án
    • bao gồm
    • SourceDir
    • thư mục khác

nơi bao gồm có tất cả các file .h và SourceDir có .c và các tập tin .cu (có tập tin chỉ có một .cu); it có Makefile.

Vấn đề với Makefile của tôi là khi tôi làm làm trong thư mục tôi nhận được một loạt các lỗi mà nói với tôi rằng các tập tin mà có() Chức năng chính (it.c trong sourcedir thư mục) không được liên kết với bất kỳ chức năng nào từ các thư viện khác. Giữ nguyên cho tập tin .cu của tôi.

Bạn có thể cho tôi một số gợi ý về những gì có thể sai với Makefile của tôi không? Tôi sử dụng như một tài liệu tham khảo các bài Stackoverflow sau: makefile for C++/CUDA project

Cảm ơn bạn đã giúp đỡ của bạn,
Vlad

EDIT:
Đây là Makefile gốc, một trong đó làm việc trên các tập tin c. Bạn có thể giúp tôi với những gì tôi cần phải thêm vào để các tập tin .cu được biên dịch cùng với những người khác? Cảm ơn một lần nữa. EDIT

CC = gcc 

SOURCEDIR = ../sourcedir 

EXE = it 

SOURCES = $(SOURCEDIR)/it.c \ 
      $(SOURCEDIR)/em.c \ 
      $(SOURCEDIR)/art.c \ 
      $(SOURCEDIR)/cg.c \ 
      $(SOURCEDIR)/amatrix.c \ 
      $(SOURCEDIR)/itreadargs.c \ 
      $(SOURCEDIR)/sparse.c \ 
      $(SOURCEDIR)/misc.c \ 
      $(SOURCEDIR)/eval.c \ 
      $(SOURCEDIR)/imgtools.c \ 
      $(SOURCEDIR)/calc.c \ 
      $(SOURCEDIR)/egif_lib.c \ 
      $(SOURCEDIR)/dgif_lib.c \ 
      $(SOURCEDIR)/gif_err.c \ 
      $(SOURCEDIR)/gif_hash.c 

IDIR  = -I../include 

OBJS  = $(SOURCES:.c=.o) 

CFLAGS  = -O3 -finline-functions -Winline -Wall -falign-loops=2 -falign-jumps=2 -falign-functions=2 -Wstrict-prototypes 

#CFLAGS  = -g -Wstrict-prototypes -Winline -Wall 

LFLAGS  = -lm 


$(EXE) : $(OBJS) 
    $(CC) $(CFLAGS) -o $(EXE) $(OBJS) $(LFLAGS) 

%.o : %.c 
    $(CC) -c $(IDIR) $(CFLAGS) $< -o [email protected] 

clean: 
    rm -f $(OBJS) $(EXE) 

SAU:
Tôi đã thay đổi Makefile một số chi tiết, làm sạch nó một chút, và bây giờ tôi chỉ nhận được một vài lỗi có liên quan đến một thực tế là .cu là không nhận được liên kết với c các tệp và ngược lại.

CC := gcc 

SOURCEDIR := ../sourcedir 

EXE := it 

SOURCES := $(SOURCEDIR)/it.c \ 
      $(SOURCEDIR)/em.c \ 
      $(SOURCEDIR)/art.c \ 
      $(SOURCEDIR)/cg.c \ 
      $(SOURCEDIR)/amatrix.c \ 
      $(SOURCEDIR)/itreadargs.c \ 
      $(SOURCEDIR)/sparse.c \ 
      $(SOURCEDIR)/misc.c \ 
      $(SOURCEDIR)/eval.c \ 
      $(SOURCEDIR)/imgtools.c \ 
      $(SOURCEDIR)/calc.c \ 
      $(SOURCEDIR)/egif_lib.c \ 
      $(SOURCEDIR)/dgif_lib.c \ 
      $(SOURCEDIR)/gif_err.c \ 
      $(SOURCEDIR)/gif_hash.c 

CU_SOURCES := $(SOURCEDIR)/cg_cuda.cu 

IDIR  := ../include 

INCLUDES := -I../include 

H_FILES := $(IDIR)/analyze.h \ 
      $(IDIR)/calc.h \ 
      $(IDIR)/eval.h \ 
      $(IDIR)/gif_hash.h \ 
      $(IDIR)/gif_lib.h \ 
      $(IDIR)/imgtools.h \ 
      $(IDIR)/iradon.h \ 
      $(IDIR)/iradoninc.h \ 
      $(IDIR)/it.h \ 
      $(IDIR)/itini.h \ 
      $(IDIR)/misc.h \ 
      $(IDIR)/sparse.h   

CFLAGS := -g -O3 

NVCCFLAGS := -g -G -O3 -arch=sm_20 

LDFLAGS  := -lGL -lGLU -lglut -lpthread -lcuda 

HOST_OBJ := $(SOURCES:.c=.c.o) 
DEVICE_OBJ := $(CU_SOURCES:.cu=.cu.o) 

%.c.o : %.c $(HFILES) 
    $(CC) -c $(INCLUDES) $(CFLAGS) $< -o [email protected] 

%.cu.o : %.cu $(H_FILES) 
    nvcc -c $(INCLUDES) $(NVFLAGS) $< -o [email protected] 


$(EXE): $(HOST_OBJ) $(DEVICE_OBJ) 
    nvcc $(NVFLAGS) $(LDFLAGS) $(INCLUDES) -o [email protected] $^ 

clean: 
    rm -f $(OBJS) $(EXE) 

Vì vậy, bây giờ tôi đang nhận được các lỗi này:

nvcc -lGL -lGLU -lglut -lpthread -lcuda -I../include -o it ../sourcedir/it.c.o ../sourcedir/em.c.o ../sourcedir/art.c.o ../sourcedir/cg.c.o ../sourcedir/amatrix.c.o ../sourcedir/itreadargs.c.o ../sourcedir/sparse.c.o ../sourcedir/misc.c.o ../sourcedir/eval.c.o ../sourcedir/imgtools.c.o ../sourcedir/calc.c.o ../sourcedir/egif_lib.c.o ../sourcedir/dgif_lib.c.o ../sourcedir/gif_err.c.o ../sourcedir/gif_hash.c.o ../sourcedir/cg_cuda.cu.o 
../sourcedir/it.c.o: In function `main': 
/home/vburca/CUDA_Research_2012/Recon2D/it/../sourcedir/it.c:280: undefined reference to `CG_CUDA' 
../sourcedir/cg_cuda.cu.o: In function `CGUpdateAddVector(Vector*, Vector*, Vector*, float)': 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x44): undefined reference to `Error(char*, ...)' 
../sourcedir/cg_cuda.cu.o: In function `CG_CUDA(SparseMatrix*, Vector*, Vector*)': 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x15f): undefined reference to `Print(int, char*, ...)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x18c): undefined reference to `ReadFIF(char*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x1a2): undefined reference to `ImageToVector(Image*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x1b8): undefined reference to `FreeImage(Image*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x1c7): undefined reference to `DeviationVector(Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x248): undefined reference to `Print(int, char*, ...)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x255): undefined reference to `InitVector(int)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x269): undefined reference to `InitVector(int)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x27d): undefined reference to `InitVector(int)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x291): undefined reference to `InitVector(int)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x2a5): undefined reference to `InitVector(int)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x2c0): undefined reference to `Print(int, char*, ...)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x2e0): undefined reference to `MultSparseMatrixVector(SparseMatrix*, Vector*, Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x328): undefined reference to `MultSparseTMatrixVector(SparseMatrix*, Vector*, Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x37c): undefined reference to `MultSparseMatrixVector(SparseMatrix*, Vector*, Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x395): undefined reference to `MultVectorVector(Vector*, Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x3b1): undefined reference to `Print(int, char*, ...)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x3fb): undefined reference to `Print(int, char*, ...)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x414): undefined reference to `MultVectorVector(Vector*, Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x47b): undefined reference to `ConstrainVector(Vector*, float, float)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x4ce): undefined reference to `MultSparseTMatrixVector(SparseMatrix*, Vector*, Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x4e7): undefined reference to `MultVectorVector(Vector*, Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x55b): undefined reference to `MultSparseMatrixVector(SparseMatrix*, Vector*, Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x581): undefined reference to `SaveIteration(Vector*, int, char*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x5ab): undefined reference to `L2NormVector(Vector*, Vector*, float)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x602): undefined reference to `Print(int, char*, ...)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x61f): undefined reference to `VectorToImage(Vector*, int, int)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x650): undefined reference to `L2NormVector(Vector*, Vector*, float)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x66a): undefined reference to `Print(int, char*, ...)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x679): undefined reference to `FreeVector(Vector*)' 
tmpxft_00004e1d_00000000-1_cg_cuda.cudafe1.cpp:(.text+0x69c): undefined reference to `RenameImage(Image*, char*)' 
collect2: ld returned 1 exit status 
make: *** [it] Error 1 

Cảm ơn bạn đã kiên nhẫn của bạn đọc bài viết của tôi.

+1

Bạn có chắc chắn điều này đã hoạt động trước khi bạn giới thiệu tệp '.cu'? Dù sao, tôi đề nghị bạn thử thay đổi '$?' Thành '$ ^'. – Beta

+0

Tôi đã thay đổi nó; Tôi có thể đăng Makefile ban đầu là tốt ... có lẽ đó sẽ giúp với những gì tôi cần phải thêm để các tập tin .cu sẽ biên dịch là tốt. – vburca

+0

Bạn chưa cung cấp cho chúng tôi đủ thông tin (ví dụ: thông báo lỗi) để chắc chắn về vấn đề chính xác, nhưng bạn đã thực hiện nhiều thay đổi nhỏ giữa hai makefiles này. Thử tìm kiếm nhị phân: viết một tệp makefile chỉ bằng một nửa những thay đổi này và xem nó có hoạt động hay không. Nếu bạn thấy * một thay đổi * tạo nên sự khác biệt, và nó vẫn không có ý nghĩa, hãy cho chúng tôi biết. – Beta

Trả lời

2

Được rồi, điều này sẽ mất vài lần lặp lại.Hãy thử điều này và bình luận với kết quả:

CC = nvcc 

SOURCEDIR = ../sourcedir 

EXE = it 

SOURCES = $(SOURCEDIR)/it.c \ 
      $(SOURCEDIR)/em.c \ 
      $(SOURCEDIR)/art.c \ 
      $(SOURCEDIR)/cg.c \ 
      $(SOURCEDIR)/amatrix.c \ 
      $(SOURCEDIR)/itreadargs.c \ 
      $(SOURCEDIR)/sparse.c \ 
      $(SOURCEDIR)/misc.c \ 
      $(SOURCEDIR)/eval.c \ 
      $(SOURCEDIR)/imgtools.c \ 
      $(SOURCEDIR)/calc.c \ 
      $(SOURCEDIR)/egif_lib.c \ 
      $(SOURCEDIR)/dgif_lib.c \ 
      $(SOURCEDIR)/gif_err.c \ 
      $(SOURCEDIR)/gif_hash.c 

IDIR  = -I../include 

OBJS  = $(SOURCES:.c=.o) 

CFLAGS  = -O3 

NVCCFLAGS = -arch=sm_20 

LFLAGS  = -lm 

$(EXE) : $(OBJS) $(SOURCEDIR)/cg_cuda.o 
    $(CC) $(CFLAGS) -o [email protected] $^ $(LFLAGS) 

$(SOURCEDIR)/%.o : $(SOURCEDIR)/%.c 
    $(CC) $(NVCCFLAGS) $(IDIR) -c -o [email protected] $< 

$(SOURCEDIR)/%.o : $(SOURCEDIR)/%.cu $(H_FILES) 
    $(CC) $(NVCCFLAGS) $(IDIR) -c -o [email protected] $< 

clean: 
    rm -f $(OBJS) $(EXE) 

EDIT: vòng 2
Tôi đã sửa đổi các makefile. Hãy thử make clean ; make và lưu ý kết quả. Sau đó thử make ../sourcedir/cg_cuda.o.

EDIT: vòng 3
Được rồi, thử lại lần nữa: make clean ; make.

+0

make: Warning: File 'Makefile' có thời gian sửa đổi 3e + 02 s trong tương lai nvcc -O3 -o it ../sourcedir/it.o ../sourcedir/em.o ../sourcedir/art.o ../sourcedir/cg.o ../sourcedir/amatrix.o ../sourcedir/itreadargs.o ../sourcedir/sparse.o ../sourcedir/misc.o ../sourcedir/eval.o .. /sourcedir/imgtools.o ../sourcedir/calc.o ../sourcedir/egif_lib.o ../sourcedir/dgif_lib.o ../sourcedir/gif_err.o ../sourcedir/gif_hash.o -lm . ./sourcedir/it.o: Trong hàm 'main ': it.c :(. text + 0x188): tham chiếu không xác định đến' CG_CUDA' collect2: ld trả về 1 trạng thái thoát make: *** [it] Lỗi 1 – vburca

+0

Lần đầu tiên tôi chạy làm cho nó tạo ra một loạt các cảnh báo và như vậy nhưng lần thứ hai tôi chỉ nhận được lỗi được đăng ở trên. – vburca

+0

Cảm ơn rất nhiều sự giúp đỡ của bạn! – vburca