由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - Visual C++ 高手帮忙,一个Link Error
相关主题
问个GSL的问题问一下可能性,MingW生成的DLL和MSVC生成的DLL两个线程同步
C++ 在 windows 上 结果正确, 在 linux 上结果总是不一样,怎map析构
请问:稀疏矩阵运算有什么好的C++库?如何提高Spark在Yarn上的内存使用率
Matrix calculation in C++如何动态定义类和方法
有没有VC++下的矩阵运算的库类?强迫症爱好者进来做题了
问个g++的问题求问C++问题
matlab C API 怎么用啊??warning: returning address of local variable or temporary
有人用DEV-C++吗?boost::python::numpy干起
相关话题的讨论汇总
话题: gsl话题: vector话题: params话题: float话题: dict
进入Programming版参与讨论
1 (共1页)
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_

相关主题
问个g++的问题问一下可能性,MingW生成的DLL和MSVC生成的DLL两个线程同步
matlab C API 怎么用啊??map析构
有人用DEV-C++吗?如何提高Spark在Yarn上的内存使用率
进入Programming版参与讨论
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对啊?
相关主题
如何动态定义类和方法warning: returning address of local variable or temporary
强迫症爱好者进来做题了boost::python::numpy干起
求问C++问题关于在c++ member function里用signal( )
进入Programming版参与讨论
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
24
编译错误是最容易解决的吧。可以一个一个排除。
1 (共1页)
进入Programming版参与讨论
相关主题
boost::python::numpy干起有没有VC++下的矩阵运算的库类?
关于在c++ member function里用signal( )问个g++的问题
问个BT问题 :)(c )matlab C API 怎么用啊??
newbie python question有人用DEV-C++吗?
问个GSL的问题问一下可能性,MingW生成的DLL和MSVC生成的DLL两个线程同步
C++ 在 windows 上 结果正确, 在 linux 上结果总是不一样,怎map析构
请问:稀疏矩阵运算有什么好的C++库?如何提高Spark在Yarn上的内存使用率
Matrix calculation in C++如何动态定义类和方法
相关话题的讨论汇总
话题: gsl话题: vector话题: params话题: float话题: dict