I found the solution is easy, but before going deeper into the solution, keep in mind that C compilation unit (C Compiler and Assembler at least) compiles each pure C source file after resolving necessary pre-processor directives, and generates a relocatable object file as a result of compilation.
After the compilation unit does its job, there is another unit that is responsible for combining individually every source file that is compiled successfully into the relocatable form of one big object file for all. This unit is called Linker and the operation is called Linking
A very important feature in relocatable object file is that what is called variable, function will be noted as symbol so far. The linker has to solve the symbols, defining what is originally defined in an object file, reference what is being used in another to their original object file.
After this motivation, now we can call main() function as main() symbol.
I Found that the problem is because the source file that contains the main() function was not compiled. As a result, there is no a relocatable object file that contains the symbol corresponding to main() function. Hence, the compiler is complaining: you asked me to use (reference) a symbol you guaranteed to be found (defined) in another file but I found no such symbol!
The solution:
For Kiel IDE, to queue a source file for a compilation; you gotta shortlist it in the category «Source Group»,by clicking right, either adding new files to group, or existing files to group. It will result in something like the following figure:
Now we have a main function, is turned (defined) to main symbol later, and found by the linker to reference it to whatever use it in any other relocatable object files.
Здравствуйте!
В собственных интересах разбираюсь с Keil uVision и уже второй раз встречаюсь с ошибкой вида «Error: L6218E: Undefined symbol referred from __rtentry2.o», в данном случае при попытке написать файл на языке ассемблера.
В предыдущий раз ошибка подобного рода звучала как «Error: L6218E: Undefined symbol referred from main.o» при написании на языке Си (было исправлено, не хватало библиотечного файла).
В проектах используются 1986ВЕ4У, аналогично в наличии STM32F4 (Discovery board). При настройках, аналогичных сделанным авторами в сети при программировании последнего (на ASM), ошибка никуда не исчезает. Не могу понять, в чём дело и какого файла (декларации) не хватает линковщику.
*Полная строка ошибки «.ObjectsASMSimple.axf: Error: L6218E: Undefined symbol main (referred from __rtentry2.o).» — файл называется «main.s», может это связано?
После прочтения ряда тем с подобным вопросом проверил основные причины, которые могли бы вызвать данное сообщения, относящееся к линковщику:
1. Все библиотеки подключены к проекту (в данном случае CORE, Startup для проекта на ASM, где последний запускает тактирование ядра). Внутри main.s, как я понял, указаний на включение текстов библиотек может не быть.
2. Кроме латинских букв в папках и подпапках проекта из подозрительного существуют только пробелы.
3. Все возможные библиотечные файлы дублированы в папке с проектом (хотя их исходники должны лежать и в папке Keil * «»/<>).
4. Вкладка Linker ПО настроена по умолчанию, что вполне позволяло писать программы на Си.
5. Написание «USE_STDPERIPH_DRIVER» (одно из предложений для решения данной проблемы для написания на Си) не помогло.
6. Создание нового проекта/пересборка не помогли, ошибка остаётся.
Прошу помочь в решении данной трудности, а также подсказать:
1. Что это за файл __rtentry2.o (.O: Relocatable object files — справка с сайта Keil)?
2. Влияет ли вложенность папки проекта в другие папки на компиляцию?
Заранее благодарен! Проект прикрепляю.
ASM Simple.7z
Изменено 4 февраля, 2022 пользователем AzardCry
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion
Hi , I have this error message (activ22.axf: Error: L6218E:
Undefined symbol main (referred from rtentry2.o).)when I build target
. this is the code
#include <LPC17xx.H> /* Definiciones para el LPC17xx */
#define N 10000
static int8_t contador;
static int32_t leds=0x10;
void delay(int32_t milisegundos)
{ int32_t i,j; for(j=0;j<milisegundos;j++) { for(i=0;i<N;i++);
// retardo de X milisegundos }
}
int main (void)
{ LPC_GPIO1->FIODIR = 0x000000F0; /* P1[7..4] como salidas */
LPC_GPIO1->FIOCLR = 0x000000F0; /* apaga todos los LEDs */
while(1) { contador++; LPC_GPIO1->FIOPIN = leds; delay
(100*contador); // retardo variable leds<<=1; if(leds==0x100) {
leds=0x010; contador=0; } }
}
please help me because I don’t know how to do .
thanks
-
Do you use C or C++ for the project?
-
0 / 0 / 0 Регистрация: 17.11.2015 Сообщений: 8 |
|
1 |
|
01.03.2019, 17:21. Показов 12491. Ответов 19
Не знаю в какую сторону уже копать. Не так давно начал разбираться с STM32.
__________________
0 |
Модератор 8759 / 6549 / 887 Регистрация: 14.02.2011 Сообщений: 22,972 |
|
01.03.2019, 21:27 |
2 |
В коде дважды вызывается функция LCD5110_set_cursor(0, 0, &lcd1); а где эта функция описана?
0 |
0 / 0 / 0 Регистрация: 17.11.2015 Сообщений: 8 |
|
02.03.2019, 08:25 [ТС] |
3 |
функция описана в lcd5110.h. В main.c подключено с помощью #include «lcd5110.h».
0 |
Модератор 8759 / 6549 / 887 Регистрация: 14.02.2011 Сообщений: 22,972 |
|
02.03.2019, 08:46 |
4 |
функция описана в lcd5110.h. В main.c подключено с помощью #include «lcd5110.h». не надо путать кислое с пресным
В main.c подключено с помощью #include «lcd5110.h». это не подключение макрос инклюде просто берет содержимое файла и вставляет в файл main.c
0 |
1999 / 1118 / 473 Регистрация: 11.10.2018 Сообщений: 5,707 |
|
02.03.2019, 08:59 |
5 |
Разница в том, что <> — для системных h-ников. А «» — для самописных h-ников. Правильно?
0 |
domitori 0 / 0 / 0 Регистрация: 17.11.2015 Сообщений: 8 |
||||
02.03.2019, 09:04 [ТС] |
6 |
|||
не надо путать кислое с пресным в файле lcd5110.h прописано (сам проект по работе с экраном был взят на просторах интернета):
это не подключение макрос инклюде просто берет содержимое файла и вставляет в файл main.c с ардуиной никогда не работал. а основы видимо придется подтянуть
0 |
ValeryS Модератор 8759 / 6549 / 887 Регистрация: 14.02.2011 Сообщений: 22,972 |
||||||||||||||||
02.03.2019, 09:17 |
7 |
|||||||||||||||
Разница в том, что <> — для системных h-ников. А «» — для самописных h-ников. Правильно? не совсем но «действие ведете в правильном направлении»
разместим в папке компилятора
разместим в папках проекта тогда такая программа
а равно 5
а равно 3 зачем это нужно?
только к нему обязательно должен быть соответствующий «lcd5110.cpp»- или «lcd5110.dll»-файлы. Я так считаю. а так же .S .Lib и еще много чего Добавлено через 2 минуты
LCD5110_wset_cursor а эта функция откуда?
сам проект по работе с экраном был взят на просторах интернета): покажи где, я посмотрю, может что то упустил(если конечно это не нарушает правил форума, например ссылки на форумы запрещены)
0 |
domitori 0 / 0 / 0 Регистрация: 17.11.2015 Сообщений: 8 |
||||
02.03.2019, 09:46 [ТС] |
8 |
|||
а эта функция откуда? покажи где, я посмотрю, может что то упустил(если конечно это не нарушает правил форума, например ссылки на форумы запрещены) LCD5110_wset_cursor прописана уже в lcd5110.c:
проект скачивал с https://drive.google.com/file/… F0LVE/view
0 |
Модератор 8759 / 6549 / 887 Регистрация: 14.02.2011 Сообщений: 22,972 |
|
02.03.2019, 10:07 |
9 |
проект скачивал с там нет проекта, просто набор файлов
Среда — Keil5 есть у меня
контроллер stm32f103 какой именно? дальше идут буковки которые означают размер ОЗУ, ПЗУ, количество ножек,периферии
0 |
0 / 0 / 0 Регистрация: 17.11.2015 Сообщений: 8 |
|
02.03.2019, 10:18 [ТС] |
10 |
там нет проекта, просто набор файлов есть у меня какой именно? дальше идут буковки которые означают размер ОЗУ, ПЗУ, количество ножек,периферии STM32F103C8T6 мой проект по ссылке https://drive.google.com/open?… cMuH0s_Czx по предыдущей ссылке брал библиотеку для работы с экраном. Спасибо за помощь!
0 |
Модератор 8759 / 6549 / 887 Регистрация: 14.02.2011 Сообщений: 22,972 |
|
02.03.2019, 10:38 |
11 |
domitori, перезалей проект сюда Картинки и любые другие файлы загружайте на форум, во избежание их удаления или потери на сторонних ресурсах. По этой же причине коды программ также должны находиться на форуме.
0 |
0 / 0 / 0 Регистрация: 17.11.2015 Сообщений: 8 |
|
02.03.2019, 10:50 [ТС] |
12 |
загрузил.
0 |
ValeryS Модератор 8759 / 6549 / 887 Регистрация: 14.02.2011 Сообщений: 22,972 |
||||
02.03.2019, 11:08 |
13 |
|||
Сообщение было отмечено domitori как решение Решениесудя по
inline void LCD5110_set_cursor библиотека для плюсов, в чем можно убедится компилируя проект с ключом (—CPP) ..Srclcd5110.c(206): error: #20: identifier «log2» is undefined чтото не нравится в файле match.h из за условной компиляции Добавлено через 7 минут
0 |
domitori 0 / 0 / 0 Регистрация: 17.11.2015 Сообщений: 8 |
||||
02.03.2019, 11:23 [ТС] |
14 |
|||
самый простой выход, но не самый правильный, вырезать
Да, так работает. Пусть пока будет так
0 |
ValeryS Модератор 8759 / 6549 / 887 Регистрация: 14.02.2011 Сообщений: 22,972 |
||||
02.03.2019, 11:30 |
15 |
|||
Огромное спасибо за помощь!!! это не помощь это костыль может выстрелить в любой момент Добавлено через 2 минуты
Добавлено через 41 секунду
0 |
78 / 77 / 4 Регистрация: 20.11.2016 Сообщений: 233 |
|
02.03.2019, 13:16 |
16 |
ValeryS,а inline для чего прописывается?
0 |
Модератор 8759 / 6549 / 887 Регистрация: 14.02.2011 Сообщений: 22,972 |
|
02.03.2019, 13:45 |
17 |
inline для чего прописывается? ну это долгий вопрос
1 |
domitori 0 / 0 / 0 Регистрация: 17.11.2015 Сообщений: 8 |
||||||||
02.03.2019, 14:17 [ТС] |
18 |
|||||||
в lcd5110.c прописал саму функцию:
а в lcd5110.h :
ошибок не выдает
0 |
ValeryS Модератор 8759 / 6549 / 887 Регистрация: 14.02.2011 Сообщений: 22,972 |
||||||||
02.03.2019, 14:29 |
19 |
|||||||
ошибок не выдает так разумеется
еще один вариант вставить static перед функцией
все дело в связывании, в котором я не силен, поэтому и задал вопрос в специализированной ветке
еще вариант добавить в .h декларацию
0 |
21264 / 8280 / 637 Регистрация: 30.03.2009 Сообщений: 22,635 Записей в блоге: 30 |
|
02.03.2019, 15:15 |
20 |
вот я здесь задал вопрос inline в Си Для полноты картины: Как inline трактуется в C99 описано здесь: inline в Си. Там ссылка, где в том числе описана трактовка в GNU C — по смыслу похоже на C99, но немного отличается по синтаксису Как inline трактуется в C++ описано здесь: https://www.cyberforum.ru/blogs/18334/blog93.html Добавлено через 3 минуты
1 |
I am trying to run a simple tutorial (external interrupt example) on my NUCLEO-F746ZG board. I use STM32CubeMx software version 5.2.0 and Keil software version 5.28.0.0 as compiler. I get the following error:
EXTI_callbackEXTI_callback.axf: Error: L6218E: Undefined symbol ex0 (referred from stm32f7xx_it.o).
Not enough information to list image symbols.
Not enough information to list load addresses in the image map.
Finished: 2 information, 0 warning and 1 error messages.
Target not created.
where ex0 is a variable that is defined in main.c as
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
char ext0;
/* USER CODE END PV */
and it is used as the external variable inside the stm32f7xx_it.c as follows :
/* External variables --------------------------------------------------------*/
/* USER CODE BEGIN EV */
extern char ex0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if ( GPIO_Pin == GPIO_PIN_13 ) {
ex0 = 1;
}
}
/* USER CODE END EV */
by using the HAL_GPIO_EXTI_Callback function I want to assign the value of 1 to the ex0 variable, whenever the blue push button (GPIO_PIN_13) is pressed on the NUCLEO-F746ZG board.
It seems the code can not find the reference to ex0 variable, while it is defined in the main.c file. I don’t understand what is cause of this problem. Should I add some .h / .c files to the my project? In addition, many users have also complained about the «Error: L6218E: Undefined symbol VAR_NAME» when they have tried to compile their code with Keil Software. I have read some of them, but I didn’t find the main reason behind this error. I appreciate those of you who can share their experience on how to solve this error.
anyone can help me?? my board is LPC1768 and the sensor is BMP180
Rebuild target 'Target 1'
compiling BMP180.c...
compiling I2C.c...
assembling startup_LPC17xx.s...
compiling system_LPC17xx.c...
compiling GPIO_LPC17xx.c...
compiling PIN_LPC17xx.c...
linking...
.Objectsasdsa.axf: Error: L6218E: Undefined symbol main (referred from __rtentry2.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.
".Objectsasdsa.axf" - 1 Error(s), 0 Warning(s).
Target not created.
I solved this problem with the following steps;
- Delete your old project and create new project
- Choose true library from Manage Run Time Environment like so:
- Configure «Options for Target» segment. Define symbol
USE_STDPERIPH_DRIVER
and define project path like so: -
Test your configuration. Please write the following code:
#include "stm32f10x.h" // Device header int main() { }