2014-11-29 3 views
0

Когда я пытаюсь #include" json/json.h "в a. куб файл, а затем запустить сделать, я получаю следующее сообщение об ошибке:Ошибка при попытке ссылки jsoncpp и включить ее в проект CUDA: неопределенная ссылка на `Json :: Value :: Value (Json :: ValueType) '

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, и у меня не было этой проблемы #include 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 

ответ

2

Вы получили 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 содержит спецификацию связи, и не имеет отношения в, и может быть безопасно удален из, последующего компиляции цели)

EDIT:. Так что не работает, но вы говорите, что ссылка является успешным с файлом .cpp, попробуйте связывая исполняемый с г ++ вместо 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) 
+0

Я добавил то, что вы предложили на этапе связи, но я все равно получаю ту же ошибку. Кажется странным, что он отлично работает, когда я вызываю Json :: Value в .cpp-файле, но он выдает ошибку, когда я использую ее в одном из файлов .cu. –

+0

Ну, я отправил что-то еще, чтобы попробовать. Если это не сработает, может потребоваться опубликовать полный пример [MCVE] (http://stackoverflow.com/help/mcve), который демонстрирует проблему. Используете ли вы CUDA 6.5? И если все это не работает, единственным предложением, которое я могу предложить, является перемещение вашего использования Json :: в main.cpp и использование функций-оболочек или аналогичных, если вам нужно использовать его из файла .cu. У кого-то есть некоторые предложения. –