LNK2019 Ошибка в Visual Studio 2010 - PullRequest
2 голосов
/ 25 января 2012

Я создал пример проекта c ++ в Visual Studio 2010 со следующими файлами.

Ah

#ifndef A_H
#define A_H

#include <iostream>

void foo();

#endif

A.cpp

#include "A.h"

void foo()
{
    int a = 1;
}

main.cpp

#include "A.h"

int main(int argc, char* argv[])
{
    foo();    

    return 0;
}

После сборки я получаю следующий вывод:

1> ------ Начата сборка: Проект: opengl_test, Конфигурация: Отладка Win32 ------

1> main.cpp

1> А *

1> A.cpp

1> Генерация кода ...

1>Debug \ A.obj: предупреждение LNK4042: объект указан более одного раза;дополнительные функции игнорируются

1> main.obj: ошибка LNK2019: неразрешенный внешний символ «void __cdecl foo (void)» (? foo @@ YAXXZ), на который ссылается функция _main

1> C: \Пользователи \ alp \ Projects \ Test Samples \ opengl_test \ Debug \ opengl_test.exe: фатальная ошибка LNK1120: 1 неразрешенный внешний текст

========== Сборка: 0 успешно завершена, 1 не выполнена, 0 запущенана текущий момент, 0 пропущено ==========

В чем причина этой ошибки?

Ответы [ 4 ]

3 голосов
/ 26 января 2012

Я думаю, что случилось так, что A.h был в группе Source проекта, а не в группе Header, поэтому он был скомпилирован, как если бы он был .cpp. Поскольку и A.cpp, и A.h будут генерировать объектный файл A.obj, последним будет скомпилирован единственный, который был связан. Я считаю, что последний скомпилированный файл был A.h, который не имел реализации foo(), поэтому компоновщик не смог его найти.

0 голосов
/ 25 января 2012

Во-первых, вам нужно включить «stdafx.h» в ваш файл «a.cpp» перед строкой включения «ах».

Во-вторых, лучше добавить «ах» в ваш проект.«Заголовочные файлы» и добавьте «a.cpp» в ваши «Исходные файлы».

Тогда он будет скомпилирован без ошибок!Удачи.

Кстати, причина включения "stdafx.h" заключается в том, что по умолчанию в проекте используются предварительно скомпилированные заголовки, поэтому компилятор ищет "stdafx.h".

Если вы хотите, вы можете отключить «предварительно скомпилированный заголовок», тогда вам не нужен «stdafx.h», и все будет хорошо.

0 голосов
/ 26 января 2012

Код работает, когда я создал новый проект. Я не уверен, но причина ошибки может заключаться в том, что я добавил папку «C: \ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Include» во включенные каталоги в настройках проекта, и Visual Studio уже включила папку «C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Include» (для 32-разрядных программ) по умолчанию. Так что из-за этого может возникнуть конфликт. Я добавил заголовочные файлы opengl только в папку «Program Files» (x86), удалил папку «include для 64-битных программных файлов», и код opengl теперь работает.

0 голосов
/ 25 января 2012

EDIT: Не берите в голову оригинальный ответ (ниже), я думаю, что то, что вы ищете, может быть здесь: Странное "предупреждение Visual Studio 2010" LNK4042 "

Оригинальный ответ (не проблема, но, может быть, здравый совет?): Ваш заголовок должен иметь защиту вокруг него, иначе он будет определяться при каждом вызове и вызывать переопределения.

#ifndef A_H
#define A_H

#include <iostream>

void foo();

#endif //A_H
...