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
- nó
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 nó 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.
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
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
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