Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2012, 10:47   #1
alexdelphi
Пользователь
 
Регистрация: 24.08.2011
Сообщений: 40
Восклицание Visual C++ Express, ошибка LNK2019

У меня в проекте 3 файла: algorithm.h, algorithm.cpp (оба закинуты в папку \include), Task.cpp.
В файле algorithm.h следующие строки:
Код:
// ...
extern "C" int algo_init(void);
algorithm.cpp:
Код:
//...
int algo_init(void)
{
  // здесь реализация функции
}
Task.cpp:
Код:
#include <algorithm.h>
int main()
{
   algo_init(); // !
}
На строке, помеченной комментарием с восклицательным знаком, Visual C++ 2008 Express SP1 мне выдает ошибку "fatal error LNK2019: unresolved external _algo_init referenced in function _main".
Кто мне объяснит, в чем дело и как решить проблему?
alexdelphi вне форума Ответить с цитированием
Старый 11.02.2012, 11:37   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

alexdelphi
algorithm.h:
Код:
extern "C" int algo_init(void);
algorithm.cpp:
Код:
#include "stdafx.h"
#include "algorithm.h"

int algo_init(void)
{
  return 1;
}
Task.cpp:
Код:
#include "stdafx.h"
#include "algorithm.h"

int main()
{
   algo_init();
   return 0;
}
Только что попробовал, всё работает.
А ваша ошибка, называется ошибкой линковки.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 11.02.2012 в 11:40.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 11.02.2012, 11:39   #3
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

В языке С++ есть стандартный заголовочный файл algorithm, поэтому не следует свои заголовочные файлы назывть именами, совпадающими со стандартными. Кроме того нельзя свои заголовочные файлы помещать в папку include, гда расположены стандартные заголовочные файлы. И к тому же в своем проекте свои собственные заголовочные файлы нужно помещать туда, де лежат и другие файлы вашего проекта, а в программе писать не #include <algorithm>, а #include "algorithm", то есть имя заголовочного файла брать в кавычки. Тогда его поиск компилятор будет осуществлять, начиная с папки вашего проекта. А когда же вы указываете в угловых скобках, то компилятор начинает искать заголовочный файл с папки стандартных заголовков.
Так что скорей всего компилятор находит именно стандартный заголовочный файл, а не ваш. Вы этого легко можетте проверить, подведя курсор к имени этого файла и щелкнцв правой кнопочкой мыши. В открывшемся контексом меню можно выбрать пункт просмотреть файл и убедиться, компилятор выбрал ваш файл или стандартный, в котором очевидно вашей функции нет.
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 11.02.2012 в 11:54.
Сыроежка вне форума Ответить с цитированием
Старый 11.02.2012, 12:33   #4
alexdelphi
Пользователь
 
Регистрация: 24.08.2011
Сообщений: 40
По умолчанию

@Сыроежка:
Я сделал файл algorithm.h, а не algorithm, и в контекстном меню компилятор выдает мне именно мой файл.
alexdelphi вне форума Ответить с цитированием
Старый 11.02.2012, 12:33   #5
alexdelphi
Пользователь
 
Регистрация: 24.08.2011
Сообщений: 40
По умолчанию

//-- удалено --

Последний раз редактировалось alexdelphi; 11.02.2012 в 12:35.
alexdelphi вне форума Ответить с цитированием
Старый 11.02.2012, 12:45   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от alexdelphi Посмотреть сообщение
@Сыроежка:
Я сделал файл algorithm.h, а не algorithm, и в контекстном меню компилятор выдает мне именно мой файл.
В С++ у стандартных заголовочных файлов не указывается расширение. Поэтому когда в программе вы пишите #include <algorithm>, то на самом деле компилятор может подключать файл algorithm.h.

Поставьте в определение вашей функции тип линковки, то есть extern "C", так как по умолчанию предполагается extern "C++".
То есть скорей всего компилятор считает объявление функции в заголовочном файле и определение функции - как объявление двух различных функций. В главном модуле он видет объявление extern "C" и не находит ее определение, так как определена лишь функция с линковкой extern "C++"
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 11.02.2012 в 12:49.
Сыроежка вне форума Ответить с цитированием
Старый 11.02.2012, 13:27   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
В С++ у стандартных заголовочных файлов не указывается расширение. Поэтому когда в программе вы пишите #include <algorithm>, то на самом деле компилятор может подключать файл algorithm.h.
Полный БРЕД! Загляните ХОТЬ РАЗ в инклуд папку компилятора.
p51x вне форума Ответить с цитированием
Старый 11.02.2012, 13:43   #8
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Полный БРЕД! Загляните ХОТЬ РАЗ в инклуд папку компилятора.
Надо не в папку заглядывать, так как в папке может быть все, что угодно. Это на усмотрение разработчиков компиляторов, использовать расширения и какие, или не использовать. А надо знать стандарт языка С++.
Так что ваш возглас про полный бред лишь демонстрирует ваше невежество.

P.S. Да, и уберите в вашем профиле, что вы профессионал. А то вы просто этим смешите других!

Специально для таких "профессионалов", как ты, умник, цитирую стандарт С++

"1 Header name preprocessing tokens shall only appear within a #include preprocessing directive (16.2). The sequences in both forms of header-names are mapped in an implementation-defined manner to headers or to external source file names as specified in 16.2."
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 11.02.2012 в 13:57.
Сыроежка вне форума Ответить с цитированием
Старый 11.02.2012, 13:58   #9
denis301998
Новичок
Джуниор
 
Регистрация: 10.02.2012
Сообщений: 21
По умолчанию

Добавьтесь ко мне в скайп denisevg2
denis301998 вне форума Ответить с цитированием
Старый 11.02.2012, 14:31   #10
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
Радость

Цитата:
Сообщение от denis301998 Посмотреть сообщение
Добавьтесь ко мне в скайп denisevg2
Так как вы сами написали в другой теме, что вы - новичок, то я с вами поделюсь знаниями, а то вы нарветесь на такого "профессионала", как этот невежественный и агрессивный "профессионал" p51x, и будете повторять за ним всякую глупость.

Почему стандарт говорит о том, что разработчкик компиляторов могут отображать имена заголовочных файлов, которые вы указываете в программе, на собственные имена?
Дело в том, что когда появился С++, то используемые в нем имена стали дублироваться с именами языка С. Например, в С есть имя заголовочного файла string.h, то есть, если отбросить расширение .h, то именем является string.
В то же время в С++ есть щаблонный класс basic_string, описание которого разработчиики помещали также в заголовочный файл с именем string. Как тогда отличить эти два заголовочных файла, ведь они содержат разные описания? Одни разработчики компиляторов в этом случае заголовочному файлу С++ string приписывали раширение .hpp, друние - hxx, третьи - еще как-нибудь по-другому на свой манер.
Когда принимали стандарт С++, то стал вопрос, как унифицировать эти имена. Чтобы облегчить жизнь разработчииком компиляторов, которые уже использовали собственные расширения для заголовочных файлов С++, комитет пошел по следующему пути. Он разрешил разработчикам компиляторов в своих библиотеках оставлять те расширения файлов, которые они использовали. Но, с другой стороны, чтобы облегчить жизнь пользователям компиляторов, чтобы они не гадали, какое правильно нужно указывать расширение при включении заголовка с помощью директивы #include, стандарт принял общее название этих заголовочных файлов без расширений. Просто разработчики компиляторов отображали эти имена на собственные имена заголовочных файлов.
Естественно, когда выходилли новые версии компиляторов, разработчики компиляторов также упрощали жизнь самим себе, заменяя собственные имена заголовочных файлов на те, которые вводит и видет пользователь в своем проекте. Тем не менее сттандарт по-прежнему разрешает разработчикам компиляторов использовать собственные имена. Поэтому когда вы пишите, например, в С++ заголовок <string>, то это совершенно не означает, что один к одному такое эи имя имеет заголовочный файл в библиотеке данного компилятора. Компилятор при компиляции вашего кода сам устанавливвает нужное соответсвие.

Теперь вы этот вопрос лучще знаете, чем некий "профессионал" p51x.
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 11.02.2012 в 14:38.
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свой класс - ошибка линковки LNK2019: ссылка на неразрешенный внешний символ... Egyptorium Общие вопросы C/C++ 7 11.01.2012 17:48
Visual C++ 9.0 Express Edition Pizhon Visual C++ 25 09.09.2010 19:00
Проблема с windows visual styles в Visual studio 2008 express. [awa Visual C++ 2 09.01.2010 06:05
visual c++ express sinj Софт 0 08.08.2009 22:49
Visual C++ 2008 Express Edition Grisman Visual C++ 1 02.03.2009 20:19