ошибка внешней ссылки g++
-
05-07-2019 - |
Вопрос
У меня есть проблема, которая воспроизводится на g++.VС++ не встречает никаких проблем.Итак, у меня есть 2 файла cpp:
1.cpp:
#include <string>
#include <iostream>
extern const std::string QWERTY;
int main()
{
std::cout << QWERTY.c_str() << std::endl;
}
2.cpp:
#include <string>
const std::string QWERTY("qwerty");
Никакой магии, я просто хочу поместить строковые константы в отдельный файл.Во время соединения ld выдает ошибку:"неопределенная ссылка на `_QWERTY'" Первый думал обернуть оба объявления во "внешнюю "С" - не помогло.Ошибка и не C++ _QWERTY все еще существуют.
Спасибо заранее за любые предложения
Решение
Похоже, вы, вероятно, столкнулись с этим стандартом:
В C, const-квалифицированный объект в файле область применения без явного хранилища спецификатор класса имеет внешнюю связь. В C++ имеется внутренняя связь.
Внесите это изменение в 2.cpp:
#include <string>
extern const std::string QWERTY("qwerty");
В этом вопросе есть более подробная информация о том, что означает «связь» - Что такое внешняя и внутренняя связь в C++?.
Другие советы
Мне пришлось бы это поискать, но я думаю, что глобальные переменные const имеют внутреннюю связь в C++, не используйте const
и он скомпилируется нормально.
1.cpp
...
extern std::string QWERTY;
...
2.cpp
#include <string>
std::string QWERTY("qwerty");
Или вы, конечно, можете объявить/определить его как константную строку в общем заголовке.
Добавление лишнего extern
в 2.cpp он тоже скомпилируется, но я не уверен, что это стандартно или какое-то «дополнительное» g++