Ошибка при попытке связать jsoncpp и включить его в проект CUDA: неопределенная ссылка на `Json::Value::Value(Json::ValueType)'

Когда я пытаюсь #include "json/json.h" в файл.cu, а затем запускаю make, я получаю следующую ошибку:

nvcc -o звук 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): неопределенная ссылка на `Json::Value::~Value()' collect2: ld вернул 1 состояние выхода make: *** [student] Error 1

в связи с тем, когда я пытаюсь создать Json::Value. Я попытался переместиться туда, где я связываю библиотеку JsonCpp, и у меня не было этой проблемы, в том числе jsoncpp и создание Json::Value в main.cpp проекта. Похоже, что он работает неправильно в файле.cu.

Вот соответствующий материал из моего Makefile, который я получил из курса CUDA Udacity и изменил в соответствии со своими потребностями:

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

1 ответ

У тебя есть LDFLAGS определено в вашем make-файле, но вы не используете его в фазе ссылки, которую я вижу.

В следствии, -ljsoncpp не отображается в команде ссылки, которую вы опубликовали, то есть показывает ошибку.

добавлять LDFLAGS к вашей фазе ссылки:

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

(И пока мы очищаем ваш make-файл, 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) 
Другие вопросы по тегам