2012-11-16 4 views
-1

좋아, 이제이 오류에 대한 여러 가지 사례를 살펴 보았으며 지금까지이 문제의 원인을 정확히 파악하지 못했습니다. 난독증, 사과를 하더니 얼굴을 빤히 보았습니다.) 나는 이런 문제에 대한 언급을 계속 찾고 있습니다 : Undefined reference to main - collect2: ld returned 1 exit statusQtCreator build returns collect2: ld returned exit status 1 그러나 이러한 유형의 경우는 적합하지 않은 것 같습니다.링크 오류 (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 (I 어쩌면에는 OpenSSL을 ++ 암호화로 이동 결국, 또는 할지라도) . (또한 리눅스 환경에서 GCC에서 발생하지만, Win7에에는 MinGW를 사용) 링커에서

오류 메시지 :

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 

어떤 생각? 모든 것이 정의되어 있고 코드가 컴파일됩니다. 필자는 링커 오류를 디버깅하는 데 많은 경험을 한 적이 없었습니다. 만

... 지미

답변

1

당신은 당신이 사용하고있는 라이브러리와 프로그램을 연결해야 'MessageSigner.exe -o', 나는 파일 이름을 -o되어 사용하고 옵션을 컴파일합니다. -lmd5 또는 라이브러리를 g ++ 명령에 추가하고 필요에 따라 라이브러리 경로 (옵션 -Lpath)를 추가하십시오.

라이브러리로 작업하지 않고 md5.h 및 md5.cpp 소스 디렉토리에 컴파일러 호출에 md5.cpp를 추가해야합니다.

+0

Doh, 너무 바보입니다. 여러 소스 파일과 함께 IDE를 사용하는 데 너무 익숙해졌습니다. 이제 커맨드 라인이있는 제한된 컴퓨터이므로 여분의 cpp 파일을 매개 변수로 추가하는 것을 잊었습니다. 하지만 처음 시작했을 때 커맨드 라인에서 g ++을 사용했을 때 링커를 다루는 대신 cpp 파일을 컴파일 할 때 오류가 발생한다는 것을 기억합니다. 내 나쁜 기억 일 뿐이야. – DaJJHman

관련 문제