加上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之中。
再次编译,没有这个问题