c - 尝试链接 jsoncpp 并将其包含在 CUDA 项目中时出错 : undefined reference to `Json::Value::Value(Json::ValueType)'

标签 c cuda makefile nvcc jsoncpp

当我尝试在 .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: warning: ‘void __cudaRegisterLinkedBinary(const __fatBinC_Wrapper_t*, void (*)(void**), void*)’ defined but not used [-Wunused-function]

process.o: In function `count_tracks()':

tmpxft_00006061_00000000-3_process.cudafe1.cpp:(.text+0x75): undefined reference to `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 库的地方移动,但我没有遇到这个问题 #including jsoncpp 并在项目的 main.cpp 中创建一个 Json::Value 。它只是在 .cu 文件中似乎无法正常工作。

这是我的 Makefile 中的相关内容,我从 Udacity 的 CUDA 类(class)中获得并根据我的需要进行了修改:

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

最佳答案

您在 makefile 中定义了 LDFLAGS,但您没有在我看到的链接阶段使用它。

因此,-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) 

关于c - 尝试链接 jsoncpp 并将其包含在 CUDA 项目中时出错 : undefined reference to `Json::Value::Value(Json::ValueType)' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27204423/

相关文章:

c++ - GPU 共享内存库冲突

c++ - 如何编写 makefile 来处理头文件中的更改

c++ - C 程序可以处理 C++ 异常吗?

我可以将文件描述符限制设置为每线程限制吗?

c++ - 分配两个数组一次调用 cudaMalloc

c++ - 明显的 CUDA 魔法

linux -/bin/sh : Syntax Error: end of file unexpected

c - Makefile.def 与 Makefile.am

c - 用另一个结构体初始化该结构体,这可能吗?

c - 使用rand函数随机赋值