他山居士 发表于 2008-7-13 19:30:54

无法解析的外部符号

错误        1        error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall CHugeIntX:: operator wchar_t const * const(void)const " (__imp_??BCHugeIntX@@QBEQB_WXZ),该符号在函数 "public: wchar_t const * __thiscall CRSA::GetParam(enum tagRSAParam)const " (?GetParam@CRSA@@QBEQB_WW4tagRSAParam@@@Z) 中被引用        RSA.obj        RSATool2

代码:
const LPCTSTR CRSA::GetParam( const RSAParam enumRSAParam /*= RSA_EM*/ ) const
{
        switch( enumRSAParam )
        {
        case RSA_P:                return ((LPCTSTR)P); **这里出错
        case RSA_Q:                return ((LPCTSTR)Q); **这里出错
        case RSA_E:                return ((LPCTSTR)E);**这里出错
        case RSA_N:                return ((LPCTSTR)N);**这里出错
        case RSA_D:                return ((LPCTSTR)D);**这里出错
        default:
                return NULL;
        }
}


//产生质数P,Q
void CRSA::GeneratePrime(UINT32 * const pKeyBits /*= NULL*/)
{
        if(pKeyBits==NULL)
                *pKeyBits=1024;

        const UINT32 u32Bits_P = *pKeyBits / 2;
        const UINT32 u32Bits_Q = *pKeyBits - u32Bits_P;

        // 无需重复检测
        for( ; ; )
        {
                P.GeneratePrime( u32Bits_P );
                if ( CHugeIntX().Gcd( P - 1, E ) == 1 )
                {
                        break;
                }
        }

        for( ; ; )
        {
                Q.GeneratePrime( u32Bits_Q );
                if ( P!=Q && CHugeIntX().Gcd( Q - 1, E ) == 1 )
                {
                        break;
                }
        }
}

去掉GetParam函数就不会出现连接错误:L
PS:应该是(LPCTSTR)P引发的,不知什么原因?

gxqcn 发表于 2008-7-13 19:44:31

请检查:你是否在 UNICODE 环境下编译,但却未在工程中定义 UNICODE 或 _UNICODE 宏?
即你需要链接的是 UNICODE 版本,但 HugeCalc.h 及 HugeCalc.lib 却以为你需要的是 MBCS 版本

他山居士 发表于 2008-7-13 19:54:52

检查了,已经定义了_UNICODE

你编写的Demo RSATool能编译通过,我新建一个项目,代码和RSATool差不多,就是连接失败:L

gxqcn 发表于 2008-7-13 19:59:45

请问你的开发环境是:VC6?VC2005?VC2008?还是别的?

他山居士 发表于 2008-7-13 20:07:52

我用的是VS 2008,编译你写的DEMO没问题,自己建的项目就不行。:L 搞晕了

无心人 发表于 2008-7-13 20:07:53

你应该出示全部代码的

他山居士 发表于 2008-7-13 20:10:09

头文件RSA.h

#pragma once

#include "HugeCalc.h"
#include "HugeIntX.h"

typedef enum tagRSAParam
{
        RSA_E,
        RSA_P,
        RSA_Q,
        RSA_N,
        RSA_D,
        RSA_OM,
        RSA_EM,
        RSA_DM,
}RSAParam;

class CRSA
{
private:
        CHugeIntX E;
        CHugeIntX P;
        CHugeIntX Q;
        CHugeIntX N;
        CHugeIntX D;
public:
        CRSA(void);
        CRSA(UINT32 * const pE);
        CRSA(CHugeIntX n,CHugeIntX e);
        ~CRSA(void);

public:
        const LPCTSTR GetParam( const RSAParam enumRSAParam = RSA_EM ) const;

        void GeneratePrime(UINT32 * const pKeyBits = NULL);
};

他山居士 发表于 2008-7-13 20:10:50

CPP文件:RSA.CPP

#include "StdAfx.h"
#include "RSA.h"

#pragma message( "automatic link to ./Debug/HugeCalc.lib" )
#pragma comment( lib, "E:/Downloads/CopyrightByGuoXianqiang-v8.0.0.0/CopyrightByGuoXianqiang/HugeCalc/HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )

CRSA::CRSA(void)
{
        E=(UINT32)65537;
}

CRSA::CRSA(UINT32 * const pE)
{
        E=*pE;
}

CRSA::CRSA(CHugeIntX n,CHugeIntX e)
{
        N=n;
        E=e;
}

CRSA::~CRSA(void)
{

}

const LPCTSTR CRSA::GetParam( const RSAParam enumRSAParam /*= RSA_EM*/ ) const
{
        switch( enumRSAParam )
        {
        case RSA_P:                return ((LPCTSTR)P);
        case RSA_Q:                return ((LPCTSTR)Q);
        case RSA_E:                return ((LPCTSTR)E);
        case RSA_N:                return ((LPCTSTR)N);
        case RSA_D:                return ((LPCTSTR)D);
        default:
                return NULL;
        }
}

//产生质数P,Q
void CRSA::GeneratePrime(UINT32 * const pKeyBits /*= NULL*/)
{
        if(pKeyBits==NULL)
                *pKeyBits=1024;

        const UINT32 u32Bits_P = *pKeyBits / 2;
        const UINT32 u32Bits_Q = *pKeyBits - u32Bits_P;

        // 无需重复检测
        for( ; ; )
        {
                P.GeneratePrime( u32Bits_P );
                if ( CHugeIntX().Gcd( P - 1, E ) == 1 )
                {
                        break;
                }
        }

        for( ; ; )
        {
                Q.GeneratePrime( u32Bits_Q );
                if ( P!=Q && CHugeIntX().Gcd( Q - 1, E ) == 1 )
                {
                        break;
                }
        }
}

gxqcn 发表于 2008-7-13 20:31:49

我记得 kofeffect 也曾遇到该问题,后来仅仅是个宏定义问题而已。
从你反映的现象来看,可能主要是 UNICODE/MBCS 匹配问题。

他山居士 发表于 2008-7-13 20:50:52

:L 看来你写的这个东西需要进一步测试对各种开发平台的兼容性
页: [1] 2
查看完整版本: 无法解析的外部符号