首页 > 解决方案 > 尝试编译两个 .cpp 文件时出现 C++“未定义的引用”错误

问题描述

我是初学者,所以代码可能并不华丽。

以下是错误消息:

ccg6buM6.o:send.cpp:(.text+0x843): undefined reference to `enigma(char*)'
ccg6buM6.o:send.cpp:(.text+0x843): undefined reference to `enigma(char*)'
collect2.exe: error: ld returned 1 exit status

这是我的两个 .cpp 文件(分别是 enigma.cpp 和 send.cpp):

#include <iostream>
#include <string>
#include <cstring>
#include <fstream>

using namespace std;



int find(char arr[], char seek)
{
    for(int i = 0; i < 26; i++)
    {
        if(arr[i] == seek) return i;
    }
    return -1;
};

struct Rotor
{
public:

    char assignedRotor[26];

    void setRotor(int rotor)
    {
        switch(rotor)
        {
            case 1:
                for(int i = 0; i < 26; i++)
                {
                    assignedRotor[i] = rotor1[i];
                }
                break;
            case 2:
                for(int i = 0; i < 26; i++)
                {
                    assignedRotor[i] = rotor2[i];
                }
                break;
            case 3:
                for(int i = 0; i < 26; i++)
                {
                    assignedRotor[i] = rotor3[i];
                }
                break;
        };
    }
private:
    char rotor1[26] = {'E', 'K', 'M', 'F', 'L', 'G', 'D', 'Q', 'V', 'Z', 'N', 'T', 'O', 'W', 'Y', 'H', 'X', 'U', 'S', 'P', 'A', 'I', 'B', 'R', 'C', 'J'};
    char rotor2[26] = {'A', 'J', 'D', 'K', 'S', 'I', 'R', 'U', 'X', 'B', 'L', 'H', 'W', 'T', 'M', 'C', 'Q', 'G', 'Z', 'N', 'P', 'Y', 'F', 'V', 'O', 'E'};
    char rotor3[26] = {'B', 'D', 'F', 'H', 'J', 'L', 'C', 'P', 'R', 'T', 'X', 'V', 'Z', 'N', 'Y', 'E', 'I', 'W', 'G', 'A', 'K', 'M', 'U', 'S', 'Q', 'O'};
};

struct Reflector
{
char reflec[26] = {'Y', 'R', 'U', 'H', 'Q', 'S', 'L','D', 'P', 'X', 'N', 'G', 'O', 'K', 'M', 'I', 'E', 'B', 'F', 'Z', 'C', 'W', 'V', 'J', 'A', 'T'};
};


struct Machine
{
public:

    Rotor rotor1, rotor2, rotor3;
    Reflector reflector;

    Machine()
    {
        rotor1.setRotor(1); rotor2.setRotor(2); rotor3.setRotor(3);
    };

};


extern "C" char* enigma(char* message)
{
    Machine enig;
    int index;
    char letter;

    for(int i = 0; i < sizeof(message) - 4; i++)
    {

        letter = message[i];

        // Passes through thrid rotor
        index = (int)letter - 65;
        letter = enig.rotor3.assignedRotor[index];

        // Second
        index = (int)letter - 65;
        letter = enig.rotor2.assignedRotor[index];
        
        // First
        index = (int)letter - 65;
        letter = enig.rotor1.assignedRotor[index];

        // Reflector
        index = (int)letter - 65;
        letter = enig.reflector.reflec[index];

        // Back through first rotor
        index = find(enig.rotor1.assignedRotor, letter);
        letter = (char)(index + 65);

        // second 
        index = find(enig.rotor2.assignedRotor, letter);
        letter = (char)(index + 65);

        // third 
        index = find(enig.rotor3.assignedRotor, letter);
        letter = (char)(index + 65);

        message[i] = letter;

    };

    return message;
};

发送.cpp:

#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
#include "enigma.hpp"


using namespace std;

int main(int argc, char *argv[]) {

        char message[30];
        string filname = argv[2];
        
        cout << "Communication chiffré avec Enigma via " << filname << endl;
        while(message != "-1")
        {
            cout << "Message: ";
            cin >> message;
            
            if(message != "-1") 
            {
                cout << "Encryption: " << enigma(message) << endl;
                send(filname, enigma(message));
            } 
            else
            {
                cout << "Message sent.";
            }
        }
    }
    
    return 0;
}

最后是 enigma.hpp:

#include <iostream>
#include <string>
#include <cstring>
#include <fstream>

using namespace std;

#ifndef ENIGMA_HPP
#define ENIGMA_HPP

char* enigma(char* message);

#endif

我确信这个错误与头文件中的 enigma 声明以及它在 enigma.cpp 中的定义有关,但是我看不出我做错了什么。

任何指针将不胜感激。

编辑:输入后出现错误:

g++ enigma.cpp send.cpp -o send

在终端。

标签: c++header-files

解决方案


推荐阅读