加上windows.h這個標頭檔案,沒有這個問題
前提:編譯gsl庫成功,用其他功能正常,但是使用 gsl_rng.h標頭檔案,出現問題;
使用語句gsl_rng_alloc(gsl_rng_env_setup()),這樣沒問題,gsl_rng_env_setup()設定的是預設gsl_rng_mt1993,
但是直接使用gsl_rng_alloc(gsl_rng_mt1993),仍然出現lnk錯誤,同上的lnk錯誤。檢視gsl庫的官方文件,gsl_rng_default,出現問題,gsl_rng_default對應的是gsl_rng_mt1993,這樣看來是引入 random generator出現問題。
查詢相關資訊,說在vs工程中,屬性->c/c++->預處理器->預處理定義中 加上gsl_dll
查詢gsl_dll這個巨集,是什麼作用;發現其定義在 gsl_types.h檔案之中,gsl_dll巨集如下所示
#ifdef win32
# ifdef gsl_dll
# ifdef dll_export
# define gsl_var extern __declspec(dllexport)
# else
# define gsl_var extern __declspec(dllimport)
# endif
由此猜測是巨集定義出了問題,檢視extern __declspec(dllexport)和extern __declspec(dllimport),發現與def檔案相關,意思是從dll中引入資料或匯出資料,檢視libgsl.def檔案,得到以下結果
gsl_rng_borosh13 data
gsl_rng_cmrg data
gsl_rng_coveyou data
gsl_rng_default data
gsl_rng_default_seed data
gsl_rng_fishman18 data
gsl_rng_fishman20 data
gsl_rng_fishman2x data
gsl_rng_generator_types data
gsl_rng_gfsr4 data
gsl_rng_knuthran data
gsl_rng_knuthran2 data
gsl_rng_knuthran2002 data
gsl_rng_lecuyer21 data
gsl_rng_minstd data
gsl_rng_mrg data
gsl_rng_mt19937 data
gsl_rng_mt19937_1998 data
gsl_rng_mt19937_1999 data
gsl_rng_r250 data
gsl_rng_ran0 data
gsl_rng_ran1 data
gsl_rng_ran2 data
gsl_rng_ran3 data
gsl_rng_rand data
gsl_rng_rand48 data
gsl_rng_random128_bsd data
gsl_rng_random128_glibc2 data
gsl_rng_random128_libc5 data
gsl_rng_random256_bsd data
看到在def檔案中,random generator是以data形式定義,既然定義了gsl_dll,但是從dll匯入資料失敗,猜測是gsl_dll沒有發揮作用,使gsl_var替換為 extern __declspec(dllimport),嘗試將random generator中的gsl_var,直接改為extern _declspec(dllimport),在gsl_rng.h之中。
再次編譯,沒有這個問題
鏈結錯誤LNK2001
學習vc 時經常會遇到鏈結錯誤lnk2001,該錯誤非常討厭,因為對於 程式設計者來說,最好改的錯誤莫過於編譯錯誤,而一般說來發生連線錯誤時,編譯都已通過。產生連線錯誤的原因非常多,尤其lnk2001錯誤,常常使人不 明其所以然。如果不深入地學習和理解vc 要想改正連線錯誤lnk2001非 常困難。...
鏈結錯誤LNK2001
學習vc 時經常會遇到鏈結錯誤lnk2001,該錯誤非常討厭,因為對於 程式設計者來說,最好改的錯誤莫過於編譯錯誤,而一般說來發生連線錯誤時,編譯都已通過。產生連線錯誤的原因非常多,尤其lnk2001錯誤,常常使人不 明其所以然。如果不深入地學習和理解vc 要想改正連線錯誤lnk2001非 常困難。...
鏈結錯誤LNK2001
學習vc 時經常會遇到鏈結錯誤lnk2001,該錯誤非常討厭,因為對於 程式設計者來說,最好改的錯誤莫過於編譯錯誤,而一般說來發生連線錯誤時,編譯都已通過。產生連線錯誤的原因非常多,尤其lnk2001錯誤,常常使人不 明其所以然。如果不深入地學習和理解vc 要想改正連線錯誤lnk2001非 常困難。...