Error de las herramientas del vinculador LNK2005Linker Tools Error LNK2005

símbolo ya definido en el objetosymbol already defined in object

El símbolo de símbolo se definió más de una vez.The symbol symbol was defined more than once.

Este error va seguido de un error irrecuperable LNK1169.This error is followed by fatal error LNK1169.

Posibles causas y solucionesPossible causes and solutions

Por lo general, este error significa que ha interrumpido la regla de una definición, que solo permite una definición para cualquier plantilla, función, tipo u objeto que se use en un archivo objeto determinado, y solo una definición en todo el ejecutable para objetos o funciones visibles externamente.Generally, this error means you have broken the one definition rule, which allows only one definition for any used template, function, type, or object in a given object file, and only one definition across the entire executable for externally visible objects or functions.

Estas son algunas causas comunes de este error.Here are some common causes for this error.

  • Este error puede producirse cuando un archivo de encabezado define una variable.This error can occur when a header file defines a variable. Por ejemplo, si incluye este archivo de encabezado en más de un archivo de código fuente en el proyecto, se producirá un error:For example, if you include this header file in more than one source file in your project, an error results:

    // LNK2005_global.h
    int global_int;  // LNK2005
    

    Entre las posibles soluciones se incluyen:Possible solutions include:

    • Declare la variable extern en el archivo de encabezado: extern int global_int; , a continuación, defina y, opcionalmente, Inicialícelo en uno y solo un archivo de origen: int global_int = 17; .Declare the variable extern in the header file: extern int global_int;, then define it and optionally initialize it in one and only one source file: int global_int = 17;. Esta variable es ahora una global que puede usar en cualquier archivo de código fuente declarándolo, por extern ejemplo, incluyendo el archivo de encabezado.This variable is now a global that you can use in any source file by declaring it extern, for example, by including the header file. Se recomienda esta solución para las variables que deben ser globales, pero una buena práctica de ingeniería de software minimiza las variables globales.We recommend this solution for variables that must be global, but good software engineering practice minimizes global variables.

    • Declare la variable static: static int static_int = 17; .Declare the variable static: static int static_int = 17;. Esto restringe el ámbito de la definición al archivo objeto actual y permite que varios archivos objeto tengan su propia copia de la variable.This restricts the scope of the definition to the current object file, and allows multiple object files to have their own copy of the variable. No se recomienda definir variables estáticas en los archivos de encabezado debido a la posibilidad de confusión con las variables globales.We don't recommend you define static variables in header files because of the potential for confusion with global variables. Prefiere mover definiciones de variables estáticas en los archivos de código fuente que las usan.Prefer to move static variable definitions into the source files that use them.

    • Declare la variable selectany: __declspec(selectany) int global_int = 17; .Declare the variable selectany: __declspec(selectany) int global_int = 17;. Esto indica al enlazador que elija una definición para que la usen todas las referencias externas y descarte el resto.This tells the linker to pick one definition for use by all external references and to discard the rest. A veces, esta solución es útil cuando se combinan bibliotecas de importación.This solution is sometimes useful when combining import libraries. De lo contrario, no se recomienda como una manera de evitar errores del vinculador.Otherwise, we do not recommend it as a way to avoid linker errors.

  • Este error puede producirse cuando un archivo de encabezado define una función que no es inline .This error can occur when a header file defines a function that isn't inline. Si incluye este archivo de encabezado en más de un archivo de código fuente, obtendrá varias definiciones de la función en el archivo ejecutable.If you include this header file in more than one source file, you get multiple definitions of the function in the executable.

    // LNK2005_func.h
    int sample_function(int k) { return 42 * (k % 167); }  // LNK2005
    

    Entre las posibles soluciones se incluyen:Possible solutions include:

    • Agregue la inline palabra clave a la función:Add the inline keyword to the function:

      // LNK2005_func_inline.h
      inline int sample_function(int k) { return 42 * (k % 167); }
      
    • Quite el cuerpo de la función del archivo de encabezado y deje solo la declaración y, a continuación, implemente la función en uno y solo un archivo de código fuente:Remove the function body from the header file and leave only the declaration, then implement the function in one and only one source file:

      // LNK2005_func_decl.h
      int sample_function(int);
      
      // LNK2005_func_impl.cpp
      int sample_function(int k) { return 42 * (k % 167); }
      
  • Este error también puede producirse si se definen funciones miembro fuera de la declaración de clase en un archivo de encabezado:This error can also occur if you define member functions outside the class declaration in a header file:

    // LNK2005_member_outside.h
    class Sample {
    public:
        int sample_function(int);
    };
    int Sample::sample_function(int k) { return 42 * (k % 167); }  // LNK2005
    

    Para corregir este problema, mueva las definiciones de función miembro dentro de la clase.To fix this issue, move the member function definitions inside the class. Las funciones miembro definidas dentro de una declaración de clase se insertan implícitamente.Member functions defined inside a class declaration are implicitly inlined.

    // LNK2005_member_inline.h
    class Sample {
    public:
        int sample_function(int k) { return 42 * (k % 167); }
    };
    
  • Este error puede producirse si se vincula más de una versión de la biblioteca estándar o CRT.This error can occur if you link more than one version of the standard library or CRT. Por ejemplo, si intenta vincular las bibliotecas de CRT comercial y de depuración, o bien las versiones estáticas y dinámicas de una biblioteca, o dos versiones diferentes de una biblioteca estándar a su archivo ejecutable, este error puede aparecer muchas veces.For example, if you attempt to link both the retail and debug CRT libraries, or both the static and dynamic versions of a library, or two different versions of a standard library to your executable, this error may be reported many times. Para corregir este problema, quite todas las bibliotecas excepto una copia del comando Link.To fix this issue, remove all but one copy of each library from the link command. No se recomienda mezclar bibliotecas comerciales y de depuración, o versiones diferentes de una biblioteca, en el mismo archivo ejecutable.We do not recommend you mix retail and debug libraries, or different versions of a library, in the same executable.

    Para indicar al enlazador que use bibliotecas distintas de las predeterminadas, en la línea de comandos, especifique las bibliotecas que se van a usar y use la opción /NODEFAULTLIB para deshabilitar las bibliotecas predeterminadas.To tell the linker to use libraries other than the defaults, on the command line, specify the libraries to use, and use the /NODEFAULTLIB option to disable the default libraries. En el IDE, agregue referencias al proyecto para especificar las bibliotecas que se van a usar y, a continuación, abra el cuadro de diálogo páginas de propiedades del proyecto y, en el vinculador, página de propiedades de entrada , establezca omitir todas las bibliotecas predeterminadasu omitir propiedades de bibliotecas predeterminadas específicas para deshabilitar las bibliotecas predeterminadas.In the IDE, add references to your project to specify the libraries to use, and then open the Property Pages dialog for your project, and in the Linker, Input property page, set either Ignore All Default Libraries, or Ignore Specific Default Libraries properties to disable the default libraries.

  • Este error puede producirse si se mezcla el uso de bibliotecas estáticas y dinámicas cuando se usa la opción /CLR .This error can occur if you mix use of static and dynamic libraries when you use the /clr option. Por ejemplo, este error puede producirse si se compila un archivo DLL para usarlo en el archivo ejecutable que se vincula en CRT estático.For example, this error can occur if you build a DLL for use in your executable that links in the static CRT. Para corregir este problema, use solo bibliotecas estáticas o solo bibliotecas dinámicas para todo el ejecutable y para las bibliotecas que compile para usar en el archivo ejecutable.To fix this issue, use only static libraries or only dynamic libraries for the entire executable and for any libraries you build to use in the executable.

  • Este error puede producirse si el símbolo es una función empaquetada (creada mediante compilación con /GY) y se incluyó en más de un archivo, pero se cambió entre las compilaciones.This error can occur if the symbol is a packaged function (created by compiling with /Gy) and it was included in more than one file, but was changed between compilations. Para corregir este problema, vuelva a compilar todos los archivos que incluyan la función empaquetada.To fix this issue, recompile all files that include the packaged function.

  • Este error puede producirse si el símbolo se define de forma diferente en dos objetos miembro en bibliotecas diferentes, y se usan ambos objetos miembro.This error can occur if the symbol is defined differently in two member objects in different libraries, and both member objects are used. Una manera de corregir este problema cuando las bibliotecas están vinculadas estáticamente es usar el objeto de miembro de una sola biblioteca e incluir primero esa biblioteca en la línea de comandos del vinculador.One way to fix this issue when the libraries are statically linked is to use the member object from only one library, and include that library first on the linker command line. Para usar ambos símbolos, debe crear una manera de distinguirlos.To use both symbols, you must create a way to distinguish them. Por ejemplo, si puede compilar las bibliotecas desde el origen, puede ajustar cada biblioteca en un espacio de nombres único.For example, if you can build the libraries from source, you can wrap each library in a unique namespace. Como alternativa, puede crear una nueva biblioteca contenedora que use nombres únicos para ajustar las referencias a una de las bibliotecas originales, vincular la nueva biblioteca a la biblioteca original y, a continuación, vincular el archivo ejecutable a la nueva biblioteca en lugar de a la biblioteca original.Alternatively, you can create a new wrapper library that uses unique names to wrap references to one of the original libraries, link the new library to the original library, then link the executable to your new library instead of the original library.

  • Este error puede producirse si una extern const variable se define dos veces y tiene un valor diferente en cada definición.This error can occur if an extern const variable is defined twice, and has a different value in each definition. Para corregir este problema, defina la constante una sola vez o use espacios de nombres o enum class definiciones para distinguir las constantes.To fix this issue, define the constant only once, or use namespaces or enum class definitions to distinguish the constants.

  • Este error puede producirse si se utiliza UUID. lib en combinación con otros archivos. lib que definen los GUID (por ejemplo, OleDb. lib y adsiid. lib).This error can occur if you use uuid.lib in combination with other .lib files that define GUIDs (for example, oledb.lib and adsiid.lib). Por ejemplo:For example:

    oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject
    already defined in uuid.lib(go7.obj)
    

    Para corregir este problema, agregue /Force: Multiple a las opciones de la línea de comandos del vinculador y asegúrese de que UUID. lib es la primera biblioteca a la que se hace referencia.To fix this issue, add /FORCE:MULTIPLE to the linker command line options, and make sure that uuid.lib is the first library referenced.