2010-08-14 121 views
5

我正在使用nVidia的CUDA C進行一些編程。我使用Visual Studio 2008作爲我的開發環境,並且我遇到了一些鏈接問題,我想知道是否有人知道如何解決它或者有同樣的問題,可以提供解決方案。Visual Studio與Cuda的鏈接問題

我的程序由3個文件組成。 1個頭文件(stuff.h),1個C源文件(stuff.c)和1個CUDA C文件(main.cu)。 (這些名字是假的,但它只是爲了說明這一點)。

現在stuff.h/stuff.c定義/實現一些我從main.cu中調用的幫助函數。

我使用的是Visual Studio 2008和nVidia的GPU Computing SDK中的Cuda.rules,並且所有編譯都很好,但是當涉及將所有文件鏈接在一起時,它會失敗。似乎所有在stuff.h中定義的函數(並在stuff.c中實現)都沒有正確鏈接,因爲它們被標記爲「未解析的外部符號」。

什麼是可能的原因,我該如何解決這個問題?

非常感謝,

ExtremeCoder


好了,所以我設法讓這一切編譯。看起來我所要做的只是將東西實現文件的擴展名從.c改爲.cpp(意味着編譯爲C++,而編譯爲c不行!)。

這可能是什麼原因造成的?我寧願把一切都爲.C代替的.cpp(因爲這是真正的意思是C代碼...

任何指針?

回答

2

的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的主納入.cu:

// in main.cu 
extern "C" 
{ 
#include "stuff.h" 
} 
+0

感謝您的幫助。我得到了它的工作。有沒有辦法讓.cu文件編譯爲C文件,而不是C++文件呢? 謝謝。 – ExtremeCoder 2010-08-16 16:55:28

+0

您可以嘗試'--host-compilation = c'選項,但請參閱以下警告:http://forums.nvidia.com/index.php?showtopic=101609。一般來說,我更喜歡將標準C/C++文件中的main函數和其他所有內容保留下來,然後在CU文件中只包含內核和包裝器。許多Thrust的東西也需要進入CU文件... – Tom 2010-08-17 10:31:22

1

有使用CUDA,將圖像轉換爲VS 2005的項目灰度表示here。它使用OpenCV,但如果你已經安裝它應該是非常直接的

但即使你沒有OpenCV,並且不想編譯應用程序,VS 2008可以轉換並打開這個項目,您將能夠看到如何將CUDA源代碼從C/C++代碼中分離出來,以及如何正確配置項目屬性。

我還要指出的這個偉大的主題:

How do I start a new CUDA project in Visual Studio 2008?

+0

感謝您的回覆,它已經幫助我進一步,但不是我希望達到的目標。 我實際上看了一些其他項目,搞砸了一下,看起來如果我只是將stuff.c的擴展名改爲stuff.cpp,那麼一切正常。 什麼可能導致此? 謝謝。 – ExtremeCoder 2010-08-15 08:22:13

+0

好!使用.cpp擴展名是你的問題?如果您需要幫助瞭解您的問題,我們需要您編輯您的問題並粘貼VS 2008爲您提供的錯誤消息。 – karlphillip 2010-08-15 15:18:01