NVCC отказывается связывать мои объектные файлы - PullRequest
0 голосов
/ 07 июля 2010

Я пытаюсь скомпилировать проект, скомпилировав объектные файлы и затем связав их вместе, ничего сложного:

hello.o : hello.h hello.cu
    nvcc hello.cu -c -o hello.o
#...
main.o : $(objs)
    nvcc *.o -o exec

Когда я дохожу до фазы соединения, почти каждый метод оказывается отсутствующим и необъявленным, несмотря на тот факт, что nm показывает, что каждый из них фактически находится в моих объектных файлах, и их имена не исправлены. Что здесь происходит?

Ответы [ 3 ]

0 голосов
/ 10 июля 2010

Хорошо, значит, формулировка моего вопроса была неверной.На самом деле, проблема была в том, что я компилировал код на Си так:

hello.o : hello.h hello.cu
    nvcc hello.c -c -o hello.o
#...
main.o : $(objs)
    nvcc *.o -o exec

, что заставило nvcc передать файлы .c в gcc.Когда я набрал «nm * .o» в качестве имени моего метода, я обнаружил, что объектные файлы, испускаемые gcc, имеют неправильные имена, а файлы .cu, скомпилированные g ++, ожидают искаженные имена.

Мое решение состояло в том, чтобы переименовать все файлы .c в моем проекте в .cu, хотя я думаю (но не проверял), что оставить их как .c и явно вызвать g ++ для них в make-файле должно бытьдовольно.

0 голосов
/ 19 января 2011

Я пытался вызвать g ++, но все равно получал те же ошибки. Ответ был найден здесь:

http://forums.nvidia.com/index.php?showtopic=190973&st=0&gopid=1179661&#entry1179661

Короче говоря, прототипы функций должны быть правильными.

0 голосов
/ 08 июля 2010

Ваша последняя make цель выглядит фальшивой: не должна ли она сказать:

exec : $(objs)
    nvcc $(objs) -o $@

Вам также может понадобиться добавить библиотеки CUDA в командную строку (я думаю, nvcc выяснит это, когда вы компилируете файл .cu напрямую, но, возможно, этого не произойдет, если вы просто дадите его .o файлов). Итак, как-то так:

exec : $(objs)
    nvcc $(objs) -o $@ -lcuda -lcudart -lcublas

(Какие именно библиотеки вам нужны, зависит от вашего кода)

...