Проблема с Visual Studio, связанная с Cuda - PullRequest
6 голосов
/ 15 августа 2010

Я занимаюсь программированием с помощью nVidia CUDA C. Я использую Visual Studio 2008 в качестве среды разработки, и у меня возникают некоторые проблемы с некоторыми ссылками, и мне интересно, если кто-то знает способ исправить это или у него была такая же проблема и может предложить решение.

Моя программа состоит из 3 файлов. 1 файл заголовка (stuff.h), 1 исходный файл C (stuff.c) и 1 файл C CUDA (main.cu). (Названия фальшивые, но это только для иллюстрации).

Теперь stuff.h / stuff.c определяет / реализует некоторые вспомогательные функции, которые я вызываю из main.cu.

Я использую Visual Studio 2008 и Cuda.rules из GPU Computing SDK от nVidia, и все прекрасно компилируется, но ... когда речь идет о соединении всех файлов вместе, происходит сбой. Кажется, что все функции, определенные в stuff.h (и реализованные в stuff.c), не связаны правильно, поскольку они помечены как «неразрешенные внешние символы».

Каковы возможные причины и как я могу это исправить?

Большое спасибо,

ExtremeCoder


Хорошо, мне удалось собрать все это. Кажется, все, что мне нужно было сделать, это изменить расширение файла реализации вещи с .c на .cpp (то есть компиляция как c ++ работает, а компиляция как c - нет!).

Что может быть причиной этого? Я бы предпочел хранить все как .c вместо .cpp (так как на самом деле это код C ...

Есть указатели?

Ответы [ 2 ]

3 голосов
/ 16 августа 2010

Файл main.cu обрабатывается nvcc, который по умолчанию является компилятором C ++ (на самом деле это оболочка вокруг базового компилятора CUDA и cl.exe, компилятора MS по умолчанию).В результате он ищет функции с привязкой C ++, тогда как, компилируя их как C, вы получаете привязки C.

Если вы хотите сохранить свой код как C, вы можете отредактировать stuff.h для объявленияфункции как extern "C":

/* in stuff.h */
if defined(__cplusplus)
    extern "C"
    {
#endif
/* ... your declarations ... */
if defined(__cplusplus)
    }
#endif

Или вы можете включить включение stuff.h в main.cu:

// in main.cu
extern "C"
{
#include "stuff.h"
}
1 голос
/ 15 августа 2010

Существует проект VS 2005, который использует CUDA для преобразования изображений в их оттенки серого здесь . Он использует OpenCV , хотя. Если вы уже установили, это должно быть довольно просто.

Но даже если у вас нет OpenCV и вы не хотите компилировать приложение, VS 2008 может конвертировать и открывать этот проект, и вы сможете увидеть, как вы должны отделить исходный код CUDA от кода C / C ++ и как правильно настроить свойства проекта.

Я также должен указать на эту замечательную тему:

Как начать новый проект CUDA в Visual Studio 2008?

...