Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странности KEIL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
artur_off
Я понимаю, что вопрос возможно дилетантский, но выхода нет.

Есть свой h файл с глобальной переменной и дефайнами:

Код
#ifndef _STATE_OF_ENGINE_H_
#define _STATE_OF_ENGINE_H_

#define START_ENGINE    1
#define STOP_ENGINE        2
#define ROTATION_C        3
#define ROTATION_CC        4

vu8 state_of_engine = STOP_ENGINE;

#endif


этот файл подключается в двух файлах, переменная state_of_engine в этих файлах объявлена как extern. При линковке выдается следующая ошибка:

.\output\MC.axf: Error: L6200E: Symbol state_of_engine multiply defined (by main.o and 91x_it.o).

я нашел один выход, но он не оптимальный. его суть заключается вот в чем. все дефайны из этого файла переносятся в другой h файл, этот файл подключается везде где необходимы эти дефайны, а файл с переменной state_of_engine подключается только один раз в любом из сишных файлов, например в main.c.

В таком случае ошибок при линковке нет, но этот способ не оптимальный, так как требует создавать несколько h файлов.

Ради интереса, скомпилировал простой промер в борладне, в нем такой проблемы не было.
VAI
Я делаю 1 h-файл, вот такой:
Код
/* --- global.h ------------------------------------------------------------------------------------------- **
*
* -------------------------------------------------------------------------------------------------------- */
#ifndef _MY_global_H
  #define _MY_global_H

#if defined( MAIN_FILE )                // объявлена в файле, где функция main()
  #define gl_data
#else   // MAIN_FILE
  #define gl_data extern
#endif  // MAIN_FILE


// --- Глобальные данные ---------------------------------------------------------------------------------- **
gl_data volatile FLAG flag;
gl_data volatile short cur_work_mode;
gl_data unsigned int progress_index;


// --- end of file ---------------------------------------------------------------------------------------- **

А в одном из файлов, до
Код
#include "global.h"

объявляю
Код
#define MAIN_FILE

И это не странности кейла, а так положено. Если вы обзываете переменную extern, то подразумевается, что она внешняя, и где-то должно быть выделено для неё место. Вот в одном из с-файлов проекта это надо сделать. Вы это делали, добавляя ещё 1 h-файл, а я так:
Код
#if defined( MAIN_FILE )                // объявлена в файле, где функция main()
  #define gl_data
#else   // MAIN_FILE
  #define gl_data extern
#endif  // MAIN_FILE
prottoss
Цитата(artur_off @ Jan 9 2010, 16:47) *
Я понимаю, что вопрос возможно дилетантский...
...Ради интереса, скомпилировал простой промер в борладне, в нем такой проблемы не было...
Ага, борланд как раз для дилетантовsmile.gif
Один из вариантов: Объявите глобальную переменную в любом С файле, а в хедере этого файла продекларируйте extern "value_type" value. После этого все C файлы, использующие хедер с объявленной внешней переменной будут ее видеть.
artur_off
Спасибо, оба способа работают.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.