-1

好的,所以我一直在经历这个错误的各种案例,到目前为止,我还无法弄清楚这次是什么原因造成的(我有点阅读障碍,如果它盯着我的脸,我深表歉意) 我一直在寻找对此类问题的引用:对 main 的未定义引用 - collect2:ld 返回 1 退出状态QtCreator build 返回 collect2:ld 返回退出状态 1但这些类型的情况似乎不适合。

我正在编写一个程序,它会在消息被编辑后自动重新签名。签名函数接收一些信息,使用 md5 对其进行哈希处理(我知道,但有遗留要求),然后使用 Base64 对输出进行编码(通过 const unsigned char* 获取一系列字节,以及消息的总大小)

我首先尝试了 MD5 的 Crypto++ 库,它会在未来为其他哈希和协议提供扩展。在链接阶段出现大量未定义的引用错误后,我尝试了我在网上找到的另一个 md5 实现。这个只给了我两个链接错误,但我认为它们可能是由相同的原因引起的,所以我将使用第二个库以节省帖子空间。

我用于消息签名的 C++ 代码片段:

string createMessageSignature(string input)
{
    //byte digest[ CryptoPP::MD5::DIGESTSIZE ];

    //CryptoPP::MD5().CalculateDigest( digest, (byte*) input.c_str(), input.length() );

    //cout << "md5 signature: " << digest << endl;

    //string encodedDigest = base64_encode(digest, 32);

    int size = md5(input).length();
    string stringDigest = md5(input);

    const unsigned char* digest = reinterpret_cast<const unsigned char*>(stringDigest.c_str());

    cout << "md5 signature hash: " << digest << endl;

    string encodedDigest = base64_encode(digest, size);

    cout << "signature base64 encoded: " << encodedDigest << endl;

    return encodedDigest;
}

我目前正在使用的 md5 库在这里:http ://www.zedwood.com/article/121/cpp-md5-function (虽然我想最终转向 Crypto++,或者可能是 OpenSSL)。

来自链接器的错误消息(在 Win7 上使用 MinGW,但在 linux 环境中的 GCC 上也会发生):

C:\Users\j********\Desktop\MessageSigner>C:/MinGW/bin/g++ -o MessageSigner.exe M
essageSigner.cpp
C:\Users\J****~1\AppData\Local\Temp\ccLejcEo.o:MessageSigner.cpp:(.text+0xc54):
 undefined reference to `md5(std::string)'
C:\Users\J****~1\AppData\Local\Temp\ccLejcEo.o:MessageSigner.cpp:(.text+0xc9f):
 undefined reference to `md5(std::string)'
collect2: ld returned 1 exit status

有什么想法吗?一切似乎都已定义,并且代码可以编译。我从来没有太多调试链接器错误的经验。我一直在使用的唯一编译选项是 -o 文件名,'-o MessageSigner.exe'

-吉米

4

1 回答 1

1

您必须将您的程序与您正在使用的库链接起来。将 -lmd5 或您的库调用的任何内容添加到您的 g++ 命令,并在必要时添加库路径(选项 -Lpath)

如果您不使用库而是将 md5.h 和 md5.cpp 复制到源目录中,则必须将 md5.cpp 添加到编译器调用中。

于 2012-11-16T17:05:18.663 回答