【问题标题】:Linking errors (collect2: ld returned 1)链接错误(collect2: ld 返回 1)
【发布时间】:2012-11-16 16:53:27
【问题描述】:

好的,所以我一直在处理这个错误的各种案例,到目前为止,我还无法弄清楚这次是什么原因造成的(我有点阅读障碍,如果它盯着我看,我深表歉意面对)我一直在寻找像这样的问题的参考:Undefined reference to main - collect2: ld returned 1 exit statusQtCreator build returns collect2: ld returned exit status 1 但这些类型的案例似乎不适合。

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

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

我用于消息签名的 C++ 代码的 sn-p:

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'

-吉米

【问题讨论】:

    标签: c++ linker md5


    【解决方案1】:

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

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

    【讨论】:

    • 哎呀,我太笨了。太习惯于使用带有多个源文件的 IDE,现在我是一台受限制的带有命令行的计算机,我忘记添加额外的 cpp 文件作为参数。但是我确实记得当我刚开始在命令行上使用 g++ 时,我会因为一个 cpp 文件被遗漏而不是处理链接器而得到编译错误。可能只是我记性不好。
    猜你喜欢
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2012-09-12
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多