0

当我尝试在 .cu 文件中使用 #include "json/json.h" 然后运行 ​​make 时,出现以下错误:

nvcc -o sound main.o process.o -L /usr/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -O3 -arch=sm_20 -Xcompiler -Wall -Xcompiler -Wextra -m64

/usr/local/cuda/bin/crt/link.stub:90:13:警告:'void __cudaRegisterLinkedBinary(const __fatBinC_Wrapper_t*, void (*)(void**), void*)' 已定义但未使用 [-Wunused -功能]

process.o:在函数“count_tracks()”中:

tmpxft_00006061_00000000-3_process.cudafe1.cpp:(.text+0x75): 未定义对“Json::Value::Value(Json::ValueType)”的引用

tmpxft_00006061_00000000-3_process.cudafe1.cpp:(.text+0x7d): undefined reference to `Json::Value::~Value()' collect2: ld returned 1 exit status make: *** [student] Error 1

参考我何时尝试创建 Json::Value。我尝试在链接 JsonCpp 库的位置移动,但我没有遇到这个问题#include jsoncpp 并在项目的 main.cpp 中创建 Json::Value。在 .cu 文件中,它似乎无法正常工作。

这是我的 Makefile 中的相关内容,这些内容是我从 Udacity 的 CUDA 课程中获得的,并根据我的需要进行了修改:

NVCC=nvcc
CXX = g++
LDFLAGS = -L ~/parallelcomputing/soundcloud/jsoncpp/build/debug/lib -ljsoncpp
INC = -I ~/parallelcomputing/soundcloud/jsoncpp/include
OPENCV_LIBPATH=/usr/lib
OPENCV_INCLUDEPATH=/usr/include
OPENCV_LIBS=-lopencv_core -lopencv_imgproc -lopencv_highgui

CUDA_INCLUDEPATH=/usr/local/cuda/include

NVCC_OPTS=-O3 -arch=sm_20 -Xcompiler -Wall -Xcompiler -Wextra -m64

GCC_OPTS=-O3 -Wall -Wextra -m64

student: main.o process.o Makefile
    $(NVCC) -o sound main.o process.o -L $(OPENCV_LIBPATH) $(OPENCV_LIBS) $(NVCC_OPTS)

main.o: main.cpp
    g++ -c main.cpp $(GCC_OPTS) $(LDFLAGS) $(INC) -I $(CUDA_INCLUDEPATH) -I $(OPENCV_INCLUDEPATH)

process.o: process.cu
    nvcc -c process.cu $(NVCC_OPTS) $(LDFLAGS) $(INC)

clean:
    rm -f *.o *.png hw
4

1 回答 1

2

你已经LDFLAGS在你的makefile中定义了,但你没有在我可以看到的链接阶段使用它。

结果,-ljsoncpp未显示在您发布的链接命令中,即显示错误。

添加LDFLAGS到您的链接阶段:

student: main.o process.o Makefile
      $(NVCC) -o sound main.o process.o $(LDFLAGS) -L $(OPENCV_LIBPATH) $(OPENCV_LIBS) $(NVCC_OPTS)

(在我们清理您的 makefile 时,LDFLAGS包含链接规范,并且与后续编译目标无关,可以安全地从中删除。)

编辑: 因为这不起作用,但你说链接是成功的 .cpp 文件,请尝试使用 g++ 而不是 nvcc 链接可执行文件:

LDFLAGS2=-L/usr/local/cuda/lib64 -lcudart

student: main.o process.o Makefile
      $(CXX) -o sound main.o process.o $(LDFLAGS) $(LDFLAGS2) -L $(OPENCV_LIBPATH) $(OPENCV_LIBS) 
于 2014-11-29T16:51:04.243 回答