Я пытаюсь включить некоторый код CUDA в C-проект. Для этого я собираю исходный код CUDA (файл .cu) в статическую библиотеку (.lib, я разрабатываю в Windows). Затем я хочу связать эту статическую библиотеку с моим C-проектом. Тем не менее, мой компоновщик жалуется на этот шаг, и я полагаю, что это связано с проблемой компоновки C / C ++. Конкретные ошибки, которые я получаю, выглядят примерно так:
Undefined symbol '_cudaMallocHost@8' referenced in "cufft object file.lib".
Я использую CUDA 5.0 и работаю в Visual Studio 10 для написания и компиляции исходного кода CUDA на компьютере с Windows 7.
Во-первых, у меня есть исходный файл .cu, который прекрасно компилируется в статическую библиотеку («cufft object file.lib»). Я завернул все это в extern C { }
, Это выглядит примерно так:
extern "C" {
#include <cuda.h>
#include <cufft.h>
int myCUDAfunction()
{
//Some CUDA code
}
}
Для этого я создал заголовочный файл со списком функций, определенных в источнике .cu («myCUDAheader.h»), содержимое которого представляет собой просто серию прототипов функций:
int myCUDAfunction();
так далее
Наконец, в моем C-проекте я добавляю статическую библиотеку и включаю заголовочный файл.
Прежде чем я начал объявлять функции в исходном .cu файле CUDA с extern "C"
компоновщик пожаловался на отсутствие символов для этих функций. Теперь они должны быть правильно скомпилированы для связи C, но фактические функции CUDA (такие как cudaMalloc
), кажется, все еще есть связь C ++. Как мне обойти это?
Вы включили заголовки CUDA и связали cudart.lib с вашим C-приложением? Если нет, то вам, вероятно, потребуется сделать это, поскольку ваша статическая библиотека не будет включать фактическую реализацию библиотеки CUDA. Кроме того, я думаю, что порядок, в котором вы связываете их, имеет значение, я не могу вспомнить, если это ваша библиотека, затем cudart.lib или наоборот. Если худшее приходит к худшему, вам, возможно, придется настроить свой проект C как проект CUDA.
Вы не можете изменить связь библиотек CUDA, но вам это и не нужно. Итак, это:
extern "C" {
#include <cuda.h>
#include <cufft.h>
int myCUDAfunction();
.....
}
неверно, потому что вы заявляете, что библиотека времени выполнения CUDA имеет связь C, хотя, вероятно, ее нет. Это было бы правильно:
#include <cuda.h>
#include <cufft.h>
extern "C" {
int myCUDAfunction();
.....
}
Сюда myCUDAfunction
имеет связь с C и будет связываться при вызове из кода, скомпилированного и связанного с помощью цепочки инструментов C. Весь смысл в том, чтобы предоставить функции вызываемой оболочки C для ваш Код CUDA и библиотечные функции, которые он вызывает. Таким образом, ваш код на C может быть полностью неосведомлен об основах C ++ кода CUDA.