y****e 发帖数: 23939 | 1 首先,这个程序在Linux下用g++编译通过,没有任何问题。但是在Visual C++下编译时
,编译通过,但是出现下面链接错误:
error LNK2019: unresolved external symbol _gsl_vector_ptr referenced in
function "void __cdecl refalidf(struct gsl_vector const *,void *,struct gsl_
vector *)" (?refalidf@@YAXPBUgsl_vector@@PAXPAU1@@Z)
有这样两个函数:
1. static double refalifn(const gsl_vector * v, void *params)
2. static void refalidf(const gsl_vector * v, void *params, gsl_vector *
df)
问题出在第二个函数上。如果只有第一个函数,程序在VC++下也能编译链接通过。可是
这两个函数实在没有太大差别啊?难道是第二个函数有两个gsl_vector *指针?
谢谢 | m*******l 发帖数: 12782 | 2 bingo
gsl_
【在 y****e 的大作中提到】 : 首先,这个程序在Linux下用g++编译通过,没有任何问题。但是在Visual C++下编译时 : ,编译通过,但是出现下面链接错误: : error LNK2019: unresolved external symbol _gsl_vector_ptr referenced in : function "void __cdecl refalidf(struct gsl_vector const *,void *,struct gsl_ : vector *)" (?refalidf@@YAXPBUgsl_vector@@PAXPAU1@@Z) : 有这样两个函数: : 1. static double refalifn(const gsl_vector * v, void *params) : 2. static void refalidf(const gsl_vector * v, void *params, gsl_vector * : df) : 问题出在第二个函数上。如果只有第一个函数,程序在VC++下也能编译链接通过。可是
| t*****n 发帖数: 4908 | 3 需要先编译gsl的windows版吧
http://www.quantcode.com/modules/smartfaq/faq.php?faqid=94
你的程序是怎么连gsl的?
gsl_
【在 y****e 的大作中提到】 : 首先,这个程序在Linux下用g++编译通过,没有任何问题。但是在Visual C++下编译时 : ,编译通过,但是出现下面链接错误: : error LNK2019: unresolved external symbol _gsl_vector_ptr referenced in : function "void __cdecl refalidf(struct gsl_vector const *,void *,struct gsl_ : vector *)" (?refalidf@@YAXPBUgsl_vector@@PAXPAU1@@Z) : 有这样两个函数: : 1. static double refalifn(const gsl_vector * v, void *params) : 2. static void refalidf(const gsl_vector * v, void *params, gsl_vector * : df) : 问题出在第二个函数上。如果只有第一个函数,程序在VC++下也能编译链接通过。可是
| h**********c 发帖数: 4120 | 4 looks like static link error.
check project properties
linker
include path
another thing is additional libs.
I'lao becomes more and more disappointed with the so called IDEs. a lot of
trouble shooting. while NO z-t NO j.
question. 我老 is first person or third person? | y****e 发帖数: 23939 | 5 我已经编译了gsl的windows版,用的是两个static libraries,gal.lib 和cblas.lib
,不然第一个函数也不会编译过去,问题是出在第二个函数上,可第二个函数除了多一
个gsl_vector *的参数,跟第一个函数没有太大差别啊?
【在 t*****n 的大作中提到】 : 需要先编译gsl的windows版吧 : http://www.quantcode.com/modules/smartfaq/faq.php?faqid=94 : 你的程序是怎么连gsl的? : : gsl_
| b***i 发帖数: 3043 | 6 为啥refalifn里面是const *v, 而refalidf的df不是const?
gsl_
【在 y****e 的大作中提到】 : 首先,这个程序在Linux下用g++编译通过,没有任何问题。但是在Visual C++下编译时 : ,编译通过,但是出现下面链接错误: : error LNK2019: unresolved external symbol _gsl_vector_ptr referenced in : function "void __cdecl refalidf(struct gsl_vector const *,void *,struct gsl_ : vector *)" (?refalidf@@YAXPBUgsl_vector@@PAXPAU1@@Z) : 有这样两个函数: : 1. static double refalifn(const gsl_vector * v, void *params) : 2. static void refalidf(const gsl_vector * v, void *params, gsl_vector * : df) : 问题出在第二个函数上。如果只有第一个函数,程序在VC++下也能编译链接通过。可是
| h**********c 发帖数: 4120 | 7 Just jumped a similar error of a project of my own:
LINK : debug\qtwagon2012.exe not found or not built by the last incremental
link; performing full link
Creating library debug\qtwagon2012.lib and object debug\qtwagon2012.exp
glwidget.obj : error LNK2019: unresolved external symbol "public: static
class qtLight * __cdecl qtLightSingleton::getInstance(void)" (?getInstance@
qtLightSingleton@@SAPAVqtLight@@XZ) referenced in fu
nction "public: void __thiscall GLWidget::slotLight3dMoveOrders(int,float)"
(?slotLight3dMoveOrders@GLWidget@@QAEXHM@Z)
window.obj : error LNK2001: unresolved external symbol "public: static class
qtLight * __cdecl qtLightSingleton::getInstance(void)" (?getInstance@
qtLightSingleton@@SAPAVqtLight@@XZ)
debug\qtwagon2012.exe : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio
10.0\VC\BIN\link.EXE"' : return code '0x460'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio
10.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop. | h**********c 发帖数: 4120 | 8 Finally it is resolved my moving the static function's body to a cpp file.
That is why I shot the first post.
Hope it help. | j*****I 发帖数: 2626 | 9 你的app是C还是C++,这个库是C还是C++?
gsl_
【在 y****e 的大作中提到】 : 首先,这个程序在Linux下用g++编译通过,没有任何问题。但是在Visual C++下编译时 : ,编译通过,但是出现下面链接错误: : error LNK2019: unresolved external symbol _gsl_vector_ptr referenced in : function "void __cdecl refalidf(struct gsl_vector const *,void *,struct gsl_ : vector *)" (?refalidf@@YAXPBUgsl_vector@@PAXPAU1@@Z) : 有这样两个函数: : 1. static double refalifn(const gsl_vector * v, void *params) : 2. static void refalidf(const gsl_vector * v, void *params, gsl_vector * : df) : 问题出在第二个函数上。如果只有第一个函数,程序在VC++下也能编译链接通过。可是
| y****e 发帖数: 23939 | 10 这个df算是输出,所以不是const
【在 b***i 的大作中提到】 : 为啥refalifn里面是const *v, 而refalidf的df不是const? : : gsl_
| | | y****e 发帖数: 23939 | 11 都是C++,其实第一个函数都能正常编译链接通过,但第二个函数就不行,这是最困扰
我的地方。
【在 j*****I 的大作中提到】 : 你的app是C还是C++,这个库是C还是C++? : : gsl_
| y****e 发帖数: 23939 | 12 这个函数是在cpp文件中,其实是另一个class member function的辅助函数,定义成
static是为了让它只有file scope。
我回头试一下把它放到另一个文件中看看。
【在 h**********c 的大作中提到】 : Finally it is resolved my moving the static function's body to a cpp file. : That is why I shot the first post. : Hope it help.
| y****e 发帖数: 23939 | 13 Still cannot fix the problem even if I change the static function to static
member function :-( | y****e 发帖数: 23939 | 14 I paste the full code to if anybody can help me out.
the function refalifn and refalifnfast are good to compile on vc++.
But the function refalidf and refalifdf will have this LNK2019 error on vc++
. Same code compiles OK on g++. It must be some kind of restraint with
visual c++.
static double refalifn(const gsl_vector * v, void *params)
{
Dict *dict = (Dict *) params;
double x = gsl_vector_get(v, 0);
double y = gsl_vector_get(v, 1);
double a = gsl_vector_get(v, 2);
EMData *this_img = (*dict)["this"];
EMData *with = (*dict)["with"];
bool mirror = (*dict)["mirror"];
Transform t(Dict("type","2d","alpha",static_cast(a)));
t.set_trans((float)x,(float)y);
t.set_mirror(mirror);
if (v->size>3) {
float sca=(float)gsl_vector_get(v, 3);
if (sca<.7 || sca>1.3) return 1.0e20;
t.set_scale((float)gsl_vector_get(v, 3));
}
EMData *tmp = this_img->process("xform",Dict("transform",&t));
if (dict->has_key("mask")) tmp->mult(*(EMData *)((*dict)["mask"]));
Cmp* c = (Cmp*) ((void*)(*dict)["cmp"]);
double result = c->cmp(tmp,with);
if (tmp != 0) delete tmp;
return result;
}
static void refalidf(const gsl_vector * v, void *params,gsl_vector * df) {
static double lstep[4] = { 0.05, 0.05, 0.1, 0.01 };
gsl_vector *vc = gsl_vector_alloc(v->size);
gsl_vector_memcpy(vc,v);
double f = refalifn(v,params);
for (unsigned int i=0; isize; i++) {
double *vp = gsl_vector_ptr(vc,i);
*vp+=lstep[i];
double f2 = refalifn(vc,params);
*vp-=lstep[i];
gsl_vector_set(df,i,(f2-f)/lstep[i]);
}
gsl_vector_free(vc);
return;
}
static void refalifdf(const gsl_vector * v, void *params, double * f, gsl_
vector * df) {
static double lstep[4] = { 0.05, 0.05, 0.1, 0.01 };
gsl_vector *vc = gsl_vector_alloc(v->size);
gsl_vector_memcpy(vc,v);
*f = refalifn(v,params);
for (unsigned int i=0; isize; i++) {
double *vp = gsl_vector_ptr(vc,i);
*vp+=lstep[i];
double f2 = refalifn(vc,params);
*vp-=lstep[i];
gsl_vector_set(df,i,(f2-*f)/lstep[i]);
}
gsl_vector_free(vc);
return;
}
static double refalifnfast(const gsl_vector * v, void *params)
{
Dict *dict = (Dict *) params;
EMData *this_img = (*dict)["this"];
EMData *img_to = (*dict)["with"];
bool mirror = (*dict)["mirror"];
double x = gsl_vector_get(v, 0);
double y = gsl_vector_get(v, 1);
double a = gsl_vector_get(v, 2);
double r = this_img->dot_rotate_translate(img_to, (float)x, (float)y, (
float)a, mirror);
int nsec = this_img->get_xsize() * this_img->get_ysize();
double result = 1.0 - r / nsec;
return result;
}
EMData *RefineAlignerCG::align(EMData * this_img, EMData *to,
const string & cmp_name, const Dict& cmp_params) const
{
if (!to) {
return 0;
}
EMData *result;
int mode = params.set_default("mode", 0);
float saz = 0.0;
float sdx = 0.0;
float sdy = 0.0;
float sscale = 1.0;
bool mirror = false;
Transform* t;
if (params.has_key("xform.align2d") ) {
t = params["xform.align2d"];
Dict params = t->get_params("2d");
saz = params["alpha"];
sdx = params["tx"];
sdy = params["ty"];
mirror = params["mirror"];
sscale = params["scale"];
} else {
t = new Transform(); // is the identity
}
if ((float)(this_img->get_attr("sigma"))==0.0 || (float)(to->get_attr("
sigma"))==0.0) {
result = this_img->process("xform",Dict("transform",t));
result->set_attr("xform.align2d",t);
delete t;
return result;
}
float step = params.set_default("step",0.1f);
float stepscale = params.set_default("stepscale",0.0f);
int np = 3;
if (stepscale!=0.0) np++;
Dict gsl_params;
gsl_params["this"] = this_img;
gsl_params["with"] = to;
gsl_params["snr"] = params["snr"];
gsl_params["mirror"] = mirror;
if (params.has_key("mask")) gsl_params["mask"]=params["mask"];
const gsl_multimin_fdfminimizer_type *T = gsl_multimin_fdfminimizer_
vector_bfgs;
gsl_vector *x = gsl_vector_alloc(np);
gsl_vector_set(x, 0, sdx);
gsl_vector_set(x, 1, sdy);
gsl_vector_set(x, 2, saz);
if (stepscale!=0.0) gsl_vector_set(x,3,1.0);
Cmp *c = 0;
gsl_multimin_function_fdf minex_func;
if (mode == 2) {
minex_func.f = &refalifnfast;
}
else {
c = Factory < Cmp >::get(cmp_name, cmp_params);
gsl_params["cmp"] = (void *) c;
minex_func.f = &refalifn;
}
minex_func.df = &refalidf;
minex_func.fdf = &refalifdf;
minex_func.n = np;
minex_func.params = (void *) &gsl_params;
gsl_multimin_fdfminimizer *s = gsl_multimin_fdfminimizer_alloc(T, np);
gsl_multimin_fdfminimizer_set(s, &minex_func, x, step, 0.001f);
int rval = GSL_CONTINUE;
int status = GSL_SUCCESS;
int iter = 1;
float precision = params.set_default("precision",0.02f);
int maxiter = params.set_default("maxiter",12);
int verbose = params.set_default("verbose",0);
while (rval == GSL_CONTINUE && iter < maxiter) {
iter++;
status = gsl_multimin_fdfminimizer_iterate(s);
if (status) {
break;
}
rval = gsl_multimin_test_gradient (s->gradient, precision);
}
int maxshift = params.set_default("maxshift",-1);
if (maxshift <= 0) {
maxshift = this_img->get_xsize() / 4;
}
float fmaxshift = static_cast(maxshift);
if ( fmaxshift >= fabs((float)gsl_vector_get(s->x, 0)) && fmaxshift >=
fabs((float)gsl_vector_get(s->x, 1)) && (stepscale==0 || (((float)gsl_vector
_get(s->x, 3))<1.3 && ((float)gsl_vector_get(s->x, 3))<0.7)) )
{
Transform tsoln(Dict("type","2d","alpha",(float)gsl_vector_get(s->x
, 2)));
tsoln.set_mirror(mirror);
tsoln.set_trans((float)gsl_vector_get(s->x, 0),(float)gsl_vector_get
(s->x, 1));
if (stepscale!=0.0) tsoln.set_scale((float)gsl_vector_get(s->x, 3));
result = this_img->process("xform",Dict("transform",&tsoln));
result->set_attr("xform.align2d",&tsoln);
} else {
if (verbose>1) printf(" Refine Failed %1.2f %1.2f %1.1f\n",(float)
gsl_vector_get(s->x, 0),(float)gsl_vector_get(s->x, 1),(float)gsl_vector_get
(s->x, 2));
result = this_img->process("xform",Dict("transform",t));
result->set_attr("xform.align2d",t);
}
delete t;
t = 0;
gsl_vector_free(x);
gsl_multimin_fdfminimizer_free(s);
if (c != 0) delete c;
return result;
} | t*****n 发帖数: 4908 | 15 我快速看了一下没觉的有什么不妥的。不过你可以试一试gsl的例子。如果编译没问题
你再对照一下自己的程序。
http://www.gnu.org/software/gsl/manual/html_node/Providing-a-fu
++
【在 y****e 的大作中提到】 : I paste the full code to if anybody can help me out. : the function refalifn and refalifnfast are good to compile on vc++. : But the function refalidf and refalifdf will have this LNK2019 error on vc++ : . Same code compiles OK on g++. It must be some kind of restraint with : visual c++. : static double refalifn(const gsl_vector * v, void *params) : { : Dict *dict = (Dict *) params; : double x = gsl_vector_get(v, 0); : double y = gsl_vector_get(v, 1);
| t****t 发帖数: 6806 | 16 你这个首先是没看懂错误信息, 它说的是符号gsl_vector_ptr (忽略前面的_)没找到.
看你的源代码, gsl_vector_ptr只在refalidf和refalifdf里用到了, 另外两个函数没
用到, 所以可以单独link. 这个本身没有什么不能解释的.
接下的问题是, 为什么gsl_vector_ptr不能link?
gsl我没用过, 不过可以看一下手册.
— Function: double * gsl_vector_ptr (gsl_vector * v, size_t i)
— Function: const double * gsl_vector_const_ptr (const gsl_vector * v, size
_t i)
These functions return a pointer to the i-th element of a vector v. If i
lies outside the allowed range of 0 to n-1 then the error handler is
invoked and a null pointer is returned. Inline versions of these functions
are used when HAVE_INLINE is defined.
所以有两个版本的gsl_vector_ptr, 一个是inline的, 另一个是extern的. Apparently
, you used extern version of gsl_vector_ptr, but VC can not find it in the
library. Maybe it has something to do with your gsl windows installation. So
, try to use the inline version when you compile your code (add -DHAVE_
INLINE to compiler option).
gsl_
【在 y****e 的大作中提到】 : 首先,这个程序在Linux下用g++编译通过,没有任何问题。但是在Visual C++下编译时 : ,编译通过,但是出现下面链接错误: : error LNK2019: unresolved external symbol _gsl_vector_ptr referenced in : function "void __cdecl refalidf(struct gsl_vector const *,void *,struct gsl_ : vector *)" (?refalidf@@YAXPBUgsl_vector@@PAXPAU1@@Z) : 有这样两个函数: : 1. static double refalifn(const gsl_vector * v, void *params) : 2. static void refalidf(const gsl_vector * v, void *params, gsl_vector * : df) : 问题出在第二个函数上。如果只有第一个函数,程序在VC++下也能编译链接通过。可是
| y****e 发帖数: 23939 | 17 真是行家一出手,便知有没有啊。一语中的。非常感谢thrust大侠。
也谢谢楼上各位的热心回答。
.
size
i
【在 t****t 的大作中提到】 : 你这个首先是没看懂错误信息, 它说的是符号gsl_vector_ptr (忽略前面的_)没找到. : 看你的源代码, gsl_vector_ptr只在refalidf和refalifdf里用到了, 另外两个函数没 : 用到, 所以可以单独link. 这个本身没有什么不能解释的. : 接下的问题是, 为什么gsl_vector_ptr不能link? : gsl我没用过, 不过可以看一下手册. : — Function: double * gsl_vector_ptr (gsl_vector * v, size_t i) : — Function: const double * gsl_vector_const_ptr (const gsl_vector * v, size : _t i) : These functions return a pointer to the i-th element of a vector v. If i : lies outside the allowed range of 0 to n-1 then the error handler is
| l*********s 发帖数: 5409 | 18 葱白!
.
size
i
【在 t****t 的大作中提到】 : 你这个首先是没看懂错误信息, 它说的是符号gsl_vector_ptr (忽略前面的_)没找到. : 看你的源代码, gsl_vector_ptr只在refalidf和refalifdf里用到了, 另外两个函数没 : 用到, 所以可以单独link. 这个本身没有什么不能解释的. : 接下的问题是, 为什么gsl_vector_ptr不能link? : gsl我没用过, 不过可以看一下手册. : — Function: double * gsl_vector_ptr (gsl_vector * v, size_t i) : — Function: const double * gsl_vector_const_ptr (const gsl_vector * v, size : _t i) : These functions return a pointer to the i-th element of a vector v. If i : lies outside the allowed range of 0 to n-1 then the error handler is
| j*****I 发帖数: 2626 | 19 这个GSL库好像是C写的. 你是不是这个什么ptr函数没有extern对啊?
【在 y****e 的大作中提到】 : 真是行家一出手,便知有没有啊。一语中的。非常感谢thrust大侠。 : 也谢谢楼上各位的热心回答。 : : . : size : i
| y****e 发帖数: 23939 | 20 你说得有道理,但是同样的程序在g++下就没有问题,其他的很多gsl function也没有
这个问题啊?
【在 j*****I 的大作中提到】 : 这个GSL库好像是C写的. 你是不是这个什么ptr函数没有extern对啊?
| | | t****t 发帖数: 6806 | 21 g++的库是现成的, windows的库是你自己编译的, 这就是不同
【在 y****e 的大作中提到】 : 你说得有道理,但是同样的程序在g++下就没有问题,其他的很多gsl function也没有 : 这个问题啊?
| y****e 发帖数: 23939 | 22 这个gsl的库倒都是自己编译的。不过在linux下的configure是gsl official support
的。但windows下的是在网上搜出来的VS solution编译的,可能确实还是有点问题的。
这个gsl也真是,就不肯花点精力给windows正式的support,还得要windows用户自己去
折腾。
【在 t****t 的大作中提到】 : g++的库是现成的, windows的库是你自己编译的, 这就是不同
| t****t 发帖数: 6806 | 23 这个说法没道理, 本来就是免费的东西, 有的用就不错了. 而且gsl官方支持cygwin的.
当然cygwin的性能不行, 但是网上有预编译的native binary, 你也可以用那个. 说实
在的科学计算用windows的人还真是不多, 大家都用linux, 就算mac也比windows强啊.
support
【在 y****e 的大作中提到】 : 这个gsl的库倒都是自己编译的。不过在linux下的configure是gsl official support : 的。但windows下的是在网上搜出来的VS solution编译的,可能确实还是有点问题的。 : 这个gsl也真是,就不肯花点精力给windows正式的support,还得要windows用户自己去 : 折腾。
| t*****n 发帖数: 4908 | |
|