Сделать дубликат символа

Я хочу вкратце сказать, что я знаю, что ТАК завален этими вопросами, и я посмотрел на многие из них:

В настоящее время я создаю дизассемблер для школьного проекта с использованием C ++, и меня обжигают дубликаты ошибок символов, когда я запускаю свой make-файл. Боюсь, что моя проблема немного сложнее, чем приведенные выше примеры. Я прошу прощения за дублирующий вопрос, но не могу понять его после нескольких часов поиска и попыток решить проблему, и я ценю любые конструктивные, полные и положительные отзывы, которые кто-либо имеет.

  • g++ версия 3.4.6 (да, я знаю, это старый школьный сервер)
  • make версия 3.81

Вот мой make-файл:

CC=g++
CFLAGS=-Wall -O0 -c

all: dasm

dasm: main.o optab.o record_tokenizer.o regex.o
$(CC) -o $@ $^

clean:
rm *.o dasm

Похоже, что Make способен конвертировать все файлы в соответствующие им объектные файлы, но ссылка на один исполняемый файл — это то, что не получается:

c++    -c -o main.o main.cpp
c++    -c -o optab.o optab.cpp
c++    -c -o record_tokenizer.o record_tokenizer.cpp
c++    -c -o regex.o regex.cpp
g++ -o dasm main.o optab.o record_tokenizer.o regex.o
duplicate symbol _optab in:
main.o
optab.o
duplicate symbol _optab in:
main.o
record_tokenizer.o
duplicate symbol _HEADER_RECORD_REGEX in:
main.o
record_tokenizer.o
duplicate symbol _END_RECORD_REGEX in:
main.o
record_tokenizer.o
duplicate symbol _TEXT_RECORD_REGEX in:
main.o
record_tokenizer.o
duplicate symbol _MOD_RECORD_REGEX in:
main.o
record_tokenizer.o
ld: 6 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [dasm] Error 1

Я определенно не эксперт C ++ и не гуру Makefile, поэтому любая помощь приветствуется. Вот соответствующие файлы:

optab.h

#ifndef __dasm__optab__
#define __dasm__optab__

#include <map>
#include <string>

std::map<short, const char*> optab;

void init_optab();
const char* get_instruction(int n);

#endif

regex.h

#ifndef __dasm__regex__
#define __dasm__regex__

#include <regex.h>

bool match(const char* pattern, const char* string);

#endif

record_tokenizer.h

#ifndef __dasm__record_tokenizer__
#define __dasm__record_tokenizer__

#include <vector>
#include <cstdlib>
#include <sstream>
#include "regex.h"#include "optab.h"
const char* HEADER_RECORD_REGEX = "^H[a-zA-Z|[:space:]]{6}[:digit:]{12}";
const char* END_RECORD_REGEX = "^E([:digit:]{6})?";
const char* TEXT_RECORD_REGEX = "^T[:digit:]{6}[0-1][0-E][:digit:]{,60}"; // TODO: improve on this
const char* MOD_RECORD_REGEX = "^M[:digit:]{8}";

struct Record {
char record_type;
std::string name;
std::string address;
std::vector<std::string> addresses; // used for T records only
};bool is_valid_record(const char* record, const char* pattern);
const int to_i(std::string n);
const Record tokenize_record(std::string record);

#endif

main.cpp

#include <iostream>
#include "record_tokenizer.h"
using namespace std;

int main(int args, const char* argv[]) {
if(args > 2) {
std::cerr << "Usage: dasm sample.obj" << std::endl;
exit(EXIT_FAILURE);
}
tokenize_record("T0000001E^050000^032003^3F^69101791^1BA0131BC0002F200A3B2FF40F102F014F0000");

return 0;
}

0

Решение

Эта строка в optab.h это проблема:

std::map<short, const char*> optab;

каждый .cpp файл, который включает в себя этот файл .h определяет optab как глобальная переменная. Это приведет к тому, что символ будет определен несколько раз.

Те же ошибки возникнут из-за строк:

const char* HEADER_RECORD_REGEX = "^H[a-zA-Z|[:space:]]{6}[:digit:]{12}";
const char* END_RECORD_REGEX = "^E([:digit:]{6})?";
const char* TEXT_RECORD_REGEX = "^T[:digit:]{6}[0-1][0-E][:digit:]{,60}";
const char* MOD_RECORD_REGEX = "^M[:digit:]{8}";

в record_tokenizer.h,

Вы можете исправить их:

  1. Делая их extern переменные и определяя их только в одном .cpp файл.

  2. Делая их static переменные.

  3. Делая их const, Это будет работать для строк, но не optab, Я полагаю, вам нужно будет изменить его значение.

    const char* const HEADER_RECORD_REGEX =  ...;
    const char* const END_RECORD_REGEX = ...;
    const char* const TEXT_RECORD_REGEX = ...;
    const char* const MOD_RECORD_REGEX = ...;
    
3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector