找回密码
 欢迎注册
查看: 16864|回复: 15

[讨论] 无法解析的外部符号

[复制链接]
发表于 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函数就不会出现连接错误
PS:应该是(LPCTSTR)P引发的,不知什么原因?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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差不多,就是连接失败
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-13 19:59:45 | 显示全部楼层
请问你的开发环境是:VC6?VC2005?VC2008?还是别的?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-7-13 20:07:52 | 显示全部楼层
我用的是VS 2008,编译你写的DEMO没问题,自己建的项目就不行。 搞晕了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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;
                }
        }
}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-7-13 20:31:49 | 显示全部楼层
我记得 kofeffect 也曾遇到该问题,后来仅仅是个宏定义问题而已。
从你反映的现象来看,可能主要是 UNICODE/MBCS 匹配问题。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-7-13 20:50:52 | 显示全部楼层
看来你写的这个东西需要进一步测试对各种开发平台的兼容性
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-25 06:22 , Processed in 0.095835 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表