c++ - 尝试编译两个 .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
在终端。
解决方案
推荐阅读
- django - 如何在 django 中创建“条款和条件复选框”?
- django - Django ORM 选择、连接、从数据中提取和排序
- microservices - 微服务架构中的冗余类
- ios - Swift:将一个对象数组和另一个对象数组保存到 NSUserDefaults 中
- python - 带参数的装饰器:没有参数时避免使用括号
- c++ - mapreduce c编程无法与-fPIC链接,如何解决?
- bigchaindb - 设置tendermint 和bigchaindb 时出错
- haskell - Haskell 中的高效字符串交换
- assembly - 如何使用 gcc 在 Windows 上组装 Intel 语法程序集?
- go - gc如何处理slice内存回收