Błąd narzędzi konsolidatora LNK2005Linker Tools Error LNK2005

symbol jest już zdefiniowany w obiekciesymbol already defined in object

Symbol symbolu został zdefiniowany więcej niż raz.The symbol symbol was defined more than once.

Następuje błąd krytyczny LNK1169.This error is followed by fatal error LNK1169.

Możliwe przyczyny i rozwiązaniaPossible causes and solutions

Ogólnie rzecz biorąc, ten błąd oznacza, że została uszkodzona jedna reguła definicji, która umożliwia tylko jedną definicję dowolnego użytego szablonu, funkcji, typu lub obiektu w danym pliku obiektu, i tylko jedną definicję w całym pliku wykonywalnym dla obiektów lub funkcji widocznych zewnętrznie.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.

Poniżej przedstawiono kilka typowych przyczyn tego błędu.Here are some common causes for this error.

  • Ten błąd może wystąpić, gdy plik nagłówkowy definiuje zmienną.This error can occur when a header file defines a variable. Na przykład jeśli ten plik nagłówkowy zostanie uwzględniony w więcej niż jednym pliku źródłowym w projekcie, zostanie zwrócony komunikat o błędzie: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
    

    Dostępne są następujące rozwiązania:Possible solutions include:

    • Zadeklaruj zmienną extern w pliku nagłówkowym: extern int global_int; , a następnie zdefiniuj ją i opcjonalnie zainicjuj w jednym i tylko jednym pliku źródłowym: 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;. Ta zmienna jest teraz globalnym, którego można użyć w dowolnym pliku źródłowym przez zadeklarowanie go extern , na przykład przez dołączenie pliku nagłówkowego.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. Zalecamy używanie tego rozwiązania w przypadku zmiennych, które muszą być globalne, ale dobrą metodą inżynieria oprogramowania minimalizuje zmienne globalne.We recommend this solution for variables that must be global, but good software engineering practice minimizes global variables.

    • Zadeklaruj zmienną statyczną: static int static_int = 17; .Declare the variable static: static int static_int = 17;. Ogranicza zakres definicji do bieżącego pliku obiektu i umożliwia wielu plikom obiektów posiadanie własnej kopii zmiennej.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. Nie zalecamy definiowania zmiennych statycznych w plikach nagłówkowych ze względu na potencjalną pomyłkę ze zmiennymi globalnymi.We don't recommend you define static variables in header files because of the potential for confusion with global variables. Wolisz przenosić definicje zmiennych statycznych do plików źródłowych, które z nich korzystają.Prefer to move static variable definitions into the source files that use them.

    • Zadeklaruj zmienną selectany: __declspec(selectany) int global_int = 17; .Declare the variable selectany: __declspec(selectany) int global_int = 17;. Nakazuje konsolidatorowi wybranie jednej definicji do użycia przez wszystkie odwołania zewnętrzne i odrzucenie reszty.This tells the linker to pick one definition for use by all external references and to discard the rest. To rozwiązanie jest czasami przydatne podczas łączenia bibliotek importu.This solution is sometimes useful when combining import libraries. W przeciwnym razie nie zalecamy jej jako sposobu uniknięcia błędów konsolidatora.Otherwise, we do not recommend it as a way to avoid linker errors.

  • Ten błąd może wystąpić, gdy plik nagłówkowy definiuje funkcję, która nie jest inline .This error can occur when a header file defines a function that isn't inline. Jeśli ten plik nagłówkowy zostanie uwzględniony w więcej niż jednym pliku źródłowym, można uzyskać wiele definicji funkcji w pliku wykonywalnym.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
    

    Dostępne są następujące rozwiązania:Possible solutions include:

    • Dodaj inline słowo kluczowe do funkcji:Add the inline keyword to the function:

      // LNK2005_func_inline.h
      inline int sample_function(int k) { return 42 * (k % 167); }
      
    • Usuń treść funkcji z pliku nagłówkowego i pozostaw tylko deklarację, a następnie Zaimplementuj funkcję w jednym i tylko w jednym pliku źródłowym: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); }
      
  • Ten błąd może również wystąpić, jeśli zdefiniujesz funkcje Członkowskie poza deklaracją klasy w pliku nagłówka: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
    

    Aby rozwiązać ten problem, Przenieś definicje funkcji składowej wewnątrz klasy.To fix this issue, move the member function definitions inside the class. Funkcje składowe zdefiniowane wewnątrz deklaracji klasy są niejawnie podkreślane.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); }
    };
    
  • Ten błąd może wystąpić w przypadku połączenia więcej niż jednej wersji biblioteki standardowej lub CRT.This error can occur if you link more than one version of the standard library or CRT. Na przykład, jeśli spróbujesz połączyć zarówno bibliotekę sieci sprzedaży detalicznej, jak i debugowania, lub zarówno statyczną, jak i dynamiczną wersję biblioteki lub dwie różne wersje biblioteki standardowej do pliku wykonywalnego, ten błąd może być raportowany wiele razy.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. Aby rozwiązać ten problem, Usuń wszystkie kopie oprócz jednej biblioteki z polecenia link.To fix this issue, remove all but one copy of each library from the link command. Nie zalecamy używania bibliotek detalicznych i debugowania ani różnych wersji biblioteki w tym samym pliku wykonywalnym.We do not recommend you mix retail and debug libraries, or different versions of a library, in the same executable.

    Aby określić, że konsolidator ma używać bibliotek innych niż domyślne, w wierszu polecenia określ biblioteki, które mają być używane, i użyj opcji /NODEFAULTLIB , aby wyłączyć domyślne biblioteki.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. W środowisku IDE Dodaj odwołania do projektu, aby określić biblioteki, które mają być używane, a następnie otwórz okno dialogowe strony właściwości dla projektu, a następnie na stronie właściwości konsolidatora, wprowadź wartość Zignoruj wszystkie biblioteki domyślnelub Ignoruj określone właściwości bibliotek domyślnych, aby wyłączyć domyślne biblioteki.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.

  • Ten błąd może wystąpić, jeśli podczas korzystania z bibliotek statycznych i dynamicznych używasz opcji /CLR .This error can occur if you mix use of static and dynamic libraries when you use the /clr option. Na przykład ten błąd może wystąpić, jeśli utworzysz bibliotekę DLL do użycia w pliku wykonywalnym, który łączy się ze statyczną CRT.For example, this error can occur if you build a DLL for use in your executable that links in the static CRT. Aby rozwiązać ten problem, należy użyć tylko bibliotek statycznych lub tylko bibliotek dynamicznych dla całego pliku wykonywalnego i dla wszystkich bibliotek, które są kompilowane do użycia w pliku wykonywalnym.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.

  • Ten błąd może wystąpić, jeśli symbol jest funkcją spakowaną (utworzoną przez kompilację z /Gy) i został uwzględniony w więcej niż jednym pliku, ale został zmieniony między kompilacjami.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. Aby rozwiązać ten problem, Skompiluj ponownie wszystkie pliki, które zawierają spakowaną funkcję.To fix this issue, recompile all files that include the packaged function.

  • Ten błąd może wystąpić, jeśli symbol jest zdefiniowany inaczej w dwóch obiektach Członkowskich w różnych bibliotekach, a oba obiekty składowe są używane.This error can occur if the symbol is defined differently in two member objects in different libraries, and both member objects are used. Jednym ze sposobów rozwiązania tego problemu, gdy biblioteki są połączone statycznie, jest użycie obiektu elementu członkowskiego tylko z jednej biblioteki i dołączenie tej biblioteki najpierw w wierszu polecenia konsolidatora.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. Aby używać obu symboli, należy utworzyć sposób ich rozróżniania.To use both symbols, you must create a way to distinguish them. Na przykład, jeśli możesz skompilować biblioteki ze źródła, możesz otoczyć każdą bibliotekę w unikatowym obszarze nazw.For example, if you can build the libraries from source, you can wrap each library in a unique namespace. Alternatywnie można utworzyć nową bibliotekę otoki, która używa unikatowych nazw do zawijania odwołań do jednej z oryginalnych bibliotek, połączyć nową bibliotekę z oryginalną biblioteką, a następnie połączyć plik wykonywalny z nową biblioteką, a nie z oryginalną biblioteką.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.

  • Ten błąd może wystąpić, jeśli extern const zmienna jest zdefiniowana dwa razy i ma inną wartość w każdej definicji.This error can occur if an extern const variable is defined twice, and has a different value in each definition. Aby rozwiązać ten problem, Zdefiniuj stałą tylko raz lub użyj przestrzeni nazw lub enum class definicji w celu odróżnienia stałych.To fix this issue, define the constant only once, or use namespaces or enum class definitions to distinguish the constants.

  • Ten błąd może wystąpić, jeśli używasz identyfikatora UUID. lib w połączeniu z innymi plikami lib, które definiują identyfikatory GUID (na przykład OLEDB. lib i 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). Na przykład:For example:

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

    Aby rozwiązać ten problem, należy dodać /Force: Multiple do opcji wiersza polecenia konsolidatora i upewnić się, że identyfikator UUID. lib to pierwsza biblioteka, do której się odwołuje.To fix this issue, add /FORCE:MULTIPLE to the linker command line options, and make sure that uuid.lib is the first library referenced.