Visual C ++ неразрешенный внешний символ (не могу найти одну из моих собственных функций) - PullRequest
4 голосов
/ 09 октября 2008

Это очень простая проблема, которая меня сейчас расстраивает. Допустим, в рамках одного решения у меня есть два проекта. Давайте назовем первый проект SimpleMath. Он имеет один заголовочный файл «Add.h», который имеет

int add(int i, int j)

и реализация "Add.cpp", которая имеет

int add(int i, int j) {
  return i+j;
}

Теперь, скажем, во втором проекте я хочу использовать функцию добавления. Тем не менее, этот код:

# включает ".. \ SimpleMath \ Add.h"

int main() {

    add(1, 2);

}

приводит к «неразрешенному внешнему символу». Как мне заставить вторую программу «узнать» о фактической реализации в файле .cpp. Как примечание: весь код вымышленный, это не то, как я программирую.

Ответы [ 7 ]

5 голосов
/ 30 июля 2009

Если вы пытаетесь связать библиотеки C с проектами C ++, вам нужно сделать что-то вроде

extern "C" {
    #include "..\SimpleMath\Add.h"
}

, так как C и C ++ используют разные имена символов.

5 голосов
/ 09 октября 2008

Причина ошибки, которую вы получаете, заключается в том, что, включив заголовочный файл, вы сообщаете компилятору о наличии символа

int add (int, int)

Это будет присутствовать во время компоновки, но вы фактически не включили этот символ (код функции) в свой проект. Быстрый способ решить эту проблему - просто добавить Add.cpp в оба проекта. Но «хорошим» решением, вероятно, было бы сделать SimpleMath библиотекой, а не приложением, изменив тип проекта в свойствах проекта.

И, кстати, вам, вероятно, нужен какой-то механизм для предотвращения многократного включения этого заголовочного файла. Я обычно использую #pragma once, что должно быть хорошо, если вы придерживаетесь Visual C ++, но это может быть не совсем переносимо, поэтому, если вы хотите переносимости, используйте более традиционный подход обертывания файла заголовка в #ifndef блоке :

#ifndef __ADD_H
#define __ADD_H

int add (int i, int j);

#endif

Удачи.

3 голосов
/ 09 октября 2008

Вы должны либо сделать Add.cpp частью библиотеки и включить ее в оба проекта. или вы должны добавить Add.cpp и ко второму проекту.

Редактировать: чтобы сделать SimpleMath библиотекой, перейдите в настройки проекта в General и измените тип конфигурации на Static Lib.

Затем перейдите в настройки своего решения, нажмите «Зависимости проекта», затем выберите свой второй проект в раскрывающемся списке и установите флажок рядом с SimpleMath. Это автоматически связывает SimpleMath с вашим вторым проектом, а также гарантирует, что любые изменения в SimpleMath будут перестроены при перестройке вашего второго проекта.

1 голос
/ 09 октября 2008

SimpleMath необходимо определить как файл библиотеки (.LIB) в свойствах проекта. Я предполагаю, что это неуправляемый (не .Net) C ++. Затем включите SimpleMath.lib в другой проект.

0 голосов
/ 27 ноября 2016

Так же, как и в том же проекте, у меня было два фильтра, и я назвал два .cpp-файла с тем же именем . Так что Visual Studio просто перезаписал один .obj при компиляции другого. В результате чего отсутствуют функции в первом .obj. Урок: никогда не называйте .cpp-файлы одинаковыми, даже в разных папках / фильтрах.

0 голосов
/ 12 декабря 2011

У меня просто была эта проблема в том же проекте ... После тщательного изучения моего кода я замечаю, что код, пытающийся вызвать функцию, был с использованием интерфейса (через вызов чисто виртуального метода = 0). Однако Я забыл добавить «виртуальное» слово в класс интерфейса и класс реализации. Как только я добавил «виртуальный», проблема была решена.

0 голосов
/ 09 октября 2008

Посмотрите по этой ссылке, она должна вам помочь:

http://msdn.microsoft.com/en-us/library/0603949d.aspx

...