在 VC++6 中使用复杂的 pow(),log(),exp() 时出错LNK2001

error LNK2001 when using complex pow(),log(),exp() in VC++6

提问人:fatemeh.rastegar 提问时间:4/17/2018 更新时间:4/17/2018 访问量:148

问:

我使用 VC++6,我想在我自制的函数之一中使用复数幂函数 (pow())。 我在头文件 (.h) 中编写了必要的函数。

这是我在头文件中的函数:

    #include "MrServers/MrVista/Ice/IceIdeaFunctors/DllInterface.h"
// Base class:
#include "MrServers/MrVista/Include/Ice/IceUtils/IceImageReconFunctors.h"
#include "MrServers/MrVista/Include/Ice/IceUtils/IceUtils.h"
#include "MrServers/MrVista/Include/Ice/IceAlgos/IceWrapper.h"


// C++ class:
#include <vector>
#include <iostream>
#include <math.h>
#include <cmath>
#include <numeric>
#include <complex>
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

// #define ACC 40.0 //Make larger to increase accuracy.
// #define BIGNO 1.0e10
// #define BIGNI 1.0e-10
// #define PI 3.14159265

typedef std::vector <float> array_1d;
typedef std::vector <array_1d> array_2d;
typedef std::vector <array_2d> array_3d;

using namespace std;
IceWrapper myice;

...other function...

void Hankel_Transform(IceAs& dstAs, IceAs& srcAs, int M, int N, int nCha, int nPHS, float delta_r, float delta_rho, int r_range)
{

    //parameters for Hankel Transform
    //M: Number of samples on a spoke
    //N: total number of orders
    //rho: a 1D vector contains rho values (in source image)
    //r:   a 1D vector contains r values   (for final image)
    //r_range: length of vector r
    double res = 0.005;
    int    z_ord = (int) N/2;
    float  pii  = 3.14159265f;  // f means float. to avoid error
    array_3d bessel_table(N, array_2d(M, array_1d(r_range)));   
    // load "bessel_table" from PDS// (will be added later)
    // load bessel_table
    //array_2d bessel_table;
    //bessel_table = read_bessel_txt();

    // create pointer in order to access srcAs and dstAs
    CMPLX *p_srcAs = (CMPLX*) srcAs.calcSplObjStartAddr();
    CMPLX *p_dstAs = (CMPLX*) dstAs.calcSplObjStartAddr();

    // Hankel Formula //
    //int        my_ind;
    float my_j;
    float r;
    float rho;
    complex<float> temp (0.0 , 0.0);
    complex<float> fn_r (0.0 , 0.0);
    complex<float> immm(0, 1);
    float ipow =0.0f;
    //CMPLX *temp;                          
    //CMPLX *fn_r;
    for (int phase = 0; phase < nPHS; phase++)
    {   for(int ord = -(N/2); ord < (N/2); ord++)       //lines
        {   for(int nc = 0; nc < nCha; nc++)            //channels
            {   for(int rr = 0; rr < r_range; rr++) //columns
                {
                    r=(float)(rr+1)*delta_r;
                    fn_r=complex<float>(0.0 , 0.0);

                    //fn_r -> re = 0;
                    //fn_r -> im = 0;
                    for(int rhoo = 0; rhoo < M; rhoo++)
                    {
                        rho = delta_rho/2 + (float)rhoo*delta_rho;

                        // to avoid redunduncy in calculation of besselj in cha and phase
                        if ( nc == 0 && phase == 0 )
                        {
                            my_j = bessj(ord , (float)(pii*rho*r));
                            bessel_table[ord+z_ord][rhoo][rr] = my_j;
                        }
                        else
                        {
                            my_j   = bessel_table[ord+z_ord][rhoo][rr];
                        }


                        //my_ind = (int)floor((float)(pii*rho*r/res));  // should be "round" :(
                        //if(my_ind==0){my_ind=1;}
                        //my_j   = bessel_table[ord+z_ord][my_ind-1];   // dar c++ andis ha az 0 shoru mishe!!
                                                        // bayad esme jadval "bessel_table" bashad!                                                                                                     

                        temp   = complex<float>(rho*my_j*p_srcAs->re , rho*my_j*p_srcAs->im);
                        fn_r  += temp;
                        p_srcAs++;              
                    }       
                    ipow = (float)ord;
                    //ICE_OUT(std::pow<complex>(fn_r,2));
                    fn_r *= std::pow(immm,ipow); //exp(ipow*log(immm));//pow(immm,ipow);
                    p_dstAs->re = real(fn_r);
                    p_dstAs->im = imag(fn_r);
                    p_dstAs++;
                    if(rr != (r_range-1) )
                    {
                        p_srcAs -= M;
                    }
                }
            }   
        }
    }

}

如果不输入这一行:,一切正常,项目正确编译。但是当我尝试放置这一行或使用 exp() 或 log() 函数编译失败并出现以下错误时:fn_r *= std::pow(immm,ipow)

    IcePFTd_HankelFunctor.obj : error LNK2001: unresolved external symbol "struct _STL::complex<float> __cdecl _STL::pow(str
uct _STL::complex<float> const &,float const &)" (?pow@_STL@@YA?AU?$complex@M@1@ABU21@ABM@Z)
/n4/x86/prod/bin/IcePFTd.dll : fatal error LNK1120: 1 unresolved externals
make: *** [\n4\x86\prod/bin/IcePFTd.dll] Error 96

我也尝试使用表达式而不是幂函数,但它也失败了,出现了同样的错误。 我尝试在 visual studio 2016 的简单代码中使用此函数 (pow()),它工作正常,可以在标题的第一行考虑。exp(ipow*log(immm))#include <complex>

你有什么想法吗? 任何帮助将不胜感激。

C++ DLL 链接器错误未 解决 - 外部 LNK2001

评论

0赞 0xC0000022L 4/17/2018
头文件中的函数定义?当然可以做到,但需要一些预防措施。您是否考虑过将所述函数包装在匿名命名空间中以将许多定义分开?另外,有什么特殊原因不将标头中的函数声明为并在某个 (, ...) 文件中定义它?extern.cpp.cxx.C
0赞 Some programmer dude 4/17/2018
Visual Studio 6及其C++编译器很,非常古老。并且不完全符合标准(它于 1998 年问世,同年 C++ 首次标准化)。不要指望命名空间中的任何内容都能按预期(或根本)工作。std
1赞 n. m. could be an AI 4/17/2018
VC++6 提醒我,是来自侏罗纪还是白垩纪?
0赞 fatemeh.rastegar 4/18/2018
是的,它很古老!但出于某种原因,我必须:(使用它

答: 暂无答案