g ++ error de referencia externa
-
05-07-2019 - |
Pregunta
Tengo un problema que se reproduce en g ++. VC ++ no encuentra ningún problema. Así que tengo 2 archivos 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");
No es mágico, solo quiero colocar constantes de cadena en un archivo separado. En el momento del enlace, ld produce un error: " referencia indefinida a `_QWERTY '" El primero piensa en envolver ambas declaraciones en " extern " C " " - no ayudó Error y no c ++ _QWERTY sigue ahí.
Gracias de antemano por cualquier sugerencia
Solución
Parece que probablemente te encuentras con este bit del estándar:
En C, un objeto const-calificado en el archivo alcance sin un almacenamiento explícito El especificador de clase tiene un enlace externo. En C ++, tiene vínculos internos.
Haz este cambio a 2.cpp:
#include <string>
extern const std::string QWERTY("qwerty");
Hay más detalles sobre qué " vinculación " significa en esta pregunta: ¿Qué es el enlace externo y el enlace interno en C ++? .
Otros consejos
Tendría que buscarlo, pero creo que las variables globales const tienen un vínculo interno en C ++, no use const
y se compilará bien.
1.cpp
...
extern std::string QWERTY;
...
2.cpp
#include <string>
std::string QWERTY("qwerty");
O podría declararlo / definirlo como una cadena constante en un encabezado común, por supuesto.
Al agregar un extern
superfluo a la 2.cpp, también se compilará, pero no estoy seguro de que sea estándar o algún "extra" de g ++