項目的編譯器和庫的版本
編譯器版本: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 即可。