【发布时间】:2017-04-29 18:04:59
【问题描述】:
我花了很多时间尝试编写一个 makefile 来编译一些 c++ 文件以及一些 .cu 文件。我目前确实获得了输出,但无法成功编译目标,它不是正确的二进制文件。
所以,基本上我的所有源文件都在一个 src 目录中,我的 makefile 在主项目文件夹中,从 src 上一层目录。我有一个 main.cpp、一个 hostDeviceCom.cu、一个 myKernel.cu 和一个 cudaErrorCheck.cu,我在以前的项目中用 nvcc 一步编译过。这个概念是在 .out 所在的位置有一个单独的构建文件夹。
所以我的问题是:我在下面的 makefile 中做错了什么?
TARGET_EXEC ?= cudaNestim.out
T_CUDA_O ?= cudaTMp.o
NVCC ?= nvcc
BUILD_DIR ?= ./build
SRC_DIRS ?= ./src
CUDA_ARCH ?= -arch=sm_52
NVCCFLAGS ?= $(CUDA_ARCH)
NVCCFLNK ?= $(CUDA_ARCH) --device-link
CXXFLAGS ?= --std=c++11 -MM -MT
CXXOPTS ?= -MM -MT
# System Libraries -------------------------------------------------------------------------------
OCV_DIR ?= -L/user/local/lib
OCV_LIB ?= -lopencv_core -lopencv_viz -lopencv_highgui -lopencv_features2d -lopencv_imgproc
OCV_INC ?= -I/usr/include
OCV_LINK ?= $(OCV_DIR) $(OCV_LIB)
CUDA_DIR ?= -L/user/local/cuda-8.0/lib64
CUDA_LIB ?= -lcutil -lcudpp -lcuda -lcudart
CUDA_INC ?= -I/usr/local/cuda-8.0/include
CUDA_LINK ?= $(CUDA_DIR) $(CUDA_LIB)
#--------------------------------------------------------------------------------------------------
# find all the source files
SRCS := $(shell find $(SRC_DIRS) -name *.cu -or -name *.cpp -or -name *.c -or -name *.s)
#go to build directory and create a .o file for each src file found
OBJS := $(SRCS:%=$(BUILD_DIR)/%.o)
# create a .d file from each .o file. SO one .d for each .source
DEPS := $(OBJS:.o=.d)
LIB_DIRS := $(OCV_LINK) $(CUDA_LINK)
INCS := $(CUDA_INC) $(OCV_INC)
$(BUILD_DIR)/$(TARGET_EXEC): $(OBJS)
$(NVCC) $(NVCCFLNK) $(OBJS) $(LIB_DIRS) -o $@
$(BUILD_DIR)/%.cu.o: %.cu
$(MKDIR_P) $(dir $@)
$(NVCC) $(NVCCFLAGS) -o $@ -c $<
#echo ".cu.o rule:" $(NVCCFLAGS) -o $@ -c $< $(OCV_INC) $(CUDA_INC)
#$(NVCC) $(NVCCFLAGS) -o $@ -c $< $(OCV_INC) $(CUDA_INC)
$(BUILD_DIR)/%.cpp.o: %.cpp
$(MKDIR_P) $(dir $@)
$(CXX) $(CXXFLAGS) $(INCS) -o $@ -c $<
# Phony rules -------------------------------------------------------------------------------
.PHONY: clean
clean:
$(RM) -r $(BUILD_DIR)
MKDIR_P ?= mkdir -p
-include $(DEPS)
我知道,我没有使用任何 .d 规则,我正在尝试完成这项工作,并在以后弄清楚如何将 .d 规则合并到更复杂的内容中。
【问题讨论】:
-
发布最终的链接命令,因为它出现在您的 shell 中。详细说明“它不是一个正确的二进制文件。”。
-
另外,如果您尝试分两步(首先是对象,然后是
cudaNestim.out)在不使用 Make 的情况下手动构建二进制文件会发生什么?
标签: c++ makefile compilation cuda