gsl出現LNK2001 LNK1120問題排查

2021-08-18 10:24:02 字數 1913 閱讀 4612

加上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非 常困難。...