clang: error: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова) * о глобальных переменных - PullRequest
0 голосов
/ 03 июля 2019

У меня проблема с компиляцией моих файлов.Я скомпилировал и получил это сообщение

"Undefined symbols for architecture x86_64:
"_airport_label", referenced from:
  FlightMap::pathfind_before(std::__1::basic_string<char, 
std::__1::char_traits<char>, std::__1::allocator<char> > const&,             
std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&) in FlightMap-9a7ab0.o
  FlightMap::pathfind(std::__1::basic_string<char, 
std::__1::char_traits<char>, std::__1::allocator<char> > const&,  
std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&) in FlightMap-9a7ab0.o
"_dijkstra", referenced from:
  FlightMap::findShortestRoute(std::__1::basic_string<char, 
std::__1::char_traits<char>, std::__1::allocator<char> > const&, 
std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&) in FlightMap-9a7ab0.o
  FlightMap::pathfind_before(std::__1::basic_string<char, 
std::__1::char_traits<char>, std::__1::allocator<char> > const&, 
std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&) in FlightMap-9a7ab0.o
  FlightMap::fun_dijkstra(std::__1::basic_string<char, 
std::__1::char_traits<char>, std::__1::allocator<char> > const&) in FlightMap-9a7ab0.o
 (maybe you meant: __ZN9FlightMap12fun_dijkstraERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE)
"_distance_label", referenced from:
  FlightMap::pathfind_before(std::__1::basic_string<char, 
std::__1::char_traits<char>, std::__1::allocator<char> > const&, 
std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&) in FlightMap-9a7ab0.o
  FlightMap::pathfind(std::__1::basic_string<char, 
std::__1::char_traits<char>, std::__1::allocator<char> > const&, 
std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&) in FlightMap-9a7ab0.o
"_path", referenced from:
FlightMap::pathfind(std::__1::basic_string<char, 
std::__1::char_traits<char>, std::__1::allocator<char> > const&, 
std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&) in FlightMap-9a7ab0.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)"

Я думаю, что есть некоторые проблемы с глобальной переменной в файле FlightMap.h.
(я редактировал Flight.h -> FlightMap.h) Я объявил 4 глобальные переменныекак

stack<string> path;
map<string, string > airport_label;
map<double, string > distance_label;
map<string, double > dijkstra;

Я уже пытался поставить "extern" перед каждой глобальной переменной, но она не работает.

В коде файла FlightMap.h (Отредактировано Flight.h ->FlightMap.h)

#ifndef LAB6_FLIGHTMAP_H
#define LAB6_FLIGHTMAP_H

#include <iostream>
#include <string>
#include <stdexcept>
#include <map>
#include <list>
#include <vector>
#include <stack>
#include "AdjacencyListDirectedGraph.h"

 extern stack<string> path;
 extern map<string, string > airport_label;
 extern map<double, string > distance_label;
 extern map<string, double > dijkstra;
 .
 .
 .

Кроме того, эти глобальные переменные используются в файле FlightMap.cpp. (Я редактировал!)

Я думаю, что именно здесь возникают проблемы

1 Ответ

1 голос
/ 03 июля 2019

Используйте полные имена в объявлениях вашего заголовочного файла:

#ifndef LAB6_FLIGHTMAP_H
#define LAB6_FLIGHTMAP_H

//#includes ...

extern std::stack<std::string> path;
extern std::map<std::string, std::string> airport_label;
extern std::map<double, std::string> distance_label;
extern std::map<std::string, double> dijkstra;
...
#endif

И в FlightMap.cpp вам нужно определить эти глобальные переменные:

std::stack<std::string> path;
std::map<std::string, std::string> airport_label;
std::map<double, std::string> distance_label;
std::map<std::string, double> dijkstra;

extern сообщает компиляторучто переменная будет определена где-то в другой единице перевода и оставляет решение этой проблемы до компоновщика.Компоновщик теперь должен найти определение в любом из скомпилированных файлов, но не может, поскольку нигде нет определения.Фактически, поместив определение (то есть без extern) в один файл (и только один файл), компоновщик будет счастлив.

...