天天看點

VS+CUDA項目中用到Eigen庫時遇到的問題

項目的編譯器和庫的版本

編譯器版本:vs2017

cuda版本:10.0

問題1:Eigen庫的代碼無法在.cu檔案中通過編譯。

項目中需要用到最小二乘法的LM算法去求解非線性方程的解,由于之前用Eigen庫實作過這個功能,而且特别友善,是以這次也打算使用此庫。但是Eigen庫的代碼無法在.cu裡面進行編譯,我看了一下報錯的檔案,發現Eigen庫裡面有一些源碼的檔案命名和cuda的源碼檔案命名相同了,可能是因為這個原因導緻的編譯問題,nvvc編譯器無法識别出。

解決方法

将利用到Eigen庫的代碼放到.cpp檔案,将cuda代碼放到.cu檔案,可以通過添加一個頭檔案進行關聯,關聯的方法可以利用函數聲明或者namespace去聲明。

問題2 生成dll時,一直報Eigen庫的錯誤,無法生成dll。

在程式運作無問題且結果正确的情況下,打算生成可供外部接口調用的dll檔案。但是在生産dll的時候卻出現了大量的報錯,我再三确認了庫的配置,還是無法準确查找出問題所在。它一直報“未定義的cv:Mat”這個錯誤,讓我再一次懷疑起是否是編譯器在生成dll時還是無法準确識别出Eigen庫的檔案,但是明明程式跑起來是沒問題的,倒是生成dll的時候就識别不出Eigen庫了。

解決方法

将包含Eigen庫的頭檔案放在所有include語句的最下邊。這個是我百度和谷歌出來的,不知道具體在哪個部落格和論壇下面看到的,然後抱着試一試的想法,就真的編譯成功生成dll,并且調用dll成功。

一些避免踩坑的方法

在C++裡,盡量少同時使用

using namespace std;
using namespace Eigen;
using namespace cv; 
           

因為這些庫裡面,有些作用域下面的函數名或者變量名是會有重複的情況的,這時候可能編譯器就難以去智能判斷,有時候會出現非算法上的問題和文法上的問題,出現一些奇奇怪怪的錯誤。一般保留一個using namespace 即可。

繼續閱讀