Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Linker не находит memmove, free, malloc ...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
tobias_ivan
В проекте в закладке Library Configuration устанавливаю значение Library равным Full DLIB, для того чтобы использовать Extended Embedded C++. При этом при линковке проекта получаю сообщение:
Error[e46]: Undefined external "malloc(size_t)" referred in main ( D:\Tobias\testiar\Debug\Obj\main.r90 )
Error[e46]: Undefined external "free(void *)" referred in main ( D:\Tobias\testiar\Debug\Obj\main.r90 )

Вот текст тестового примера:
#include <stdlib.h>
int main()
{
char *temp;
temp = (char *)malloc(512);
temp[2] = 56;
free(temp);
return 0;
}

Как быть?
Заранее всем спасибо.

ЗЫ. Реальный проект содержит "навороты" под Extended Embedded C++ и при этом используются memmove(), free() и про
_Bill
Цитата(tobias_ivan @ Jun 21 2006, 10:57) *
В проекте в закладке Library Configuration устанавливаю значение Library равным Full DLIB, для того чтобы использовать Extended Embedded C++. При этом при линковке проекта получаю сообщение:
Error[e46]: Undefined external "malloc(size_t)" referred in main ( D:\Tobias\testiar\Debug\Obj\main.r90 )
Error[e46]: Undefined external "free(void *)" referred in main ( D:\Tobias\testiar\Debug\Obj\main.r90 )
Как быть?
Заранее всем спасибо.

ЗЫ. Реальный проект содержит "навороты" под Extended Embedded C++ и при этом используются memmove(), free() и про

Ну, так это и должно быть. В Си++ Си-шные функции по-другому описываются, типа:
Код
extern "C"
        {
....................
        }

А есть ли такое в вашей версии? Я пользуюсь версией 3.20, там в stdlib.h никакой связи с Си++ нет.
IgorKossak
А чем не устраивают new/delete?
tobias_ivan
2_Bill: И в моей нет, вопрос в этом и заключается: как использовать функции библиотек stdlib.h и string.h
IgorKossak: Устраивают, только проблема не только с malloc и free. Таже проблема с функциями memset, memmove, strlen, strncpy и др.
Что можно использовать взамен?
_Bill
Цитата(tobias_ivan @ Jun 21 2006, 12:53) *
2_Bill: И в моей нет, вопрос в этом и заключается: как использовать функции библиотек stdlib.h и string.h
IgorKossak: Устраивают, только проблема не только с malloc и free. Таже проблема с функциями memset, memmove, strlen, strncpy и др.
Что можно использовать взамен?

Видимо придется добавить самому. Вот пример stdlib.h от Borland
Код
#ifdef __cplusplus
extern "C" {
#endif
........
void *        _RTLENTRY _EXPFUNC malloc(_SIZE_T __size);
.....
#ifdef __cplusplus
}
#endif
IgorKossak
tobias_ivan, у меня эти функции работают без проблем.
Посмотрел на свой stdlib.h - там уже есть обёртка, о которой писал _Bill.
Может у Вас хедер берётся не оттуда? Посмотрите настройки путей.

stdlib.h в папках inc\clib и inc\dlib разные!
tobias_ivan
ТОЧНО!

указал
#include "dlib\string.h"
#include "dlib\stdlib.h"

все собралось!

Спасибо _Bill и IgorKossak, a14.gif
_Bill
Цитата(IgorKossak @ Jun 21 2006, 13:49) *
stdlib.h в папках inc\clib и inc\dlib разные!

Спасибо! Учту на будущее.
Сергей Борщ
Цитата(tobias_ivan @ Jun 21 2006, 14:03) *
ТОЧНО!

указал
#include "dlib\string.h"
#include "dlib\stdlib.h"

все собралось!

Спасибо _Bill и IgorKossak, a14.gif
Тогда точно что-то странное у вас в настройках проекта. Вы не указали версию, но посмотрите на закладке Preprocessor компилятора куда указывает стандартный путь поиска библиотек и не стоит ли там галочка игнорировать его. У меня (4.10b) при смене библиотеки с clib на dlib путь по умолчанию автоматом сам переключается в нужные подкаталоги($TOOLKIT_DIR$\INC\;$TOOLKIT_DIR$\INC\DLIB\ vs $TOOLKIT_DIR$\INC\;$TOOLKIT_DIR$\INC\CLIB\).
IgorKossak
Могу предположить, что tobias_ivan не в IDE работает.
А то действительно всё бы автоматом получалось.
tobias_ivan
Цитата(IgorKossak @ Jun 21 2006, 20:11) *
Могу предположить, что tobias_ivan не в IDE работает.
А то действительно всё бы автоматом получалось.


Работаю в IAR EWAVR IDE версия 4.12а.
Пока писал отмазку, понял в чем дело. biggrin.gif

Наверное читали мою тему IAR + Win2000. В процессе поиска возможной проблемы пробовали раличные варианты, в том числе и сборку из командной строки (предложенной кстати буржуями). При этом заметили, что проект собирался, если из команды исключить ключ -I. Это сработало для проектов без заголовочных файлов. Затем оставили только опцию -I $TOOLKIT_DIR$\INC\, и проект собрался. А вот с опцией -I $TOOLKIT_DIR$\INC\CLIB ну не хотел... Тогда скопировали файлы из CLIB в INC и проект собрался из командной строки. Скопировали и забыли...
Так в директории $TOOLKIT_DIR$\INC\ оказался С-шный stdlib.h.
В проекте директориями по умолчанию для поиска заголовочных файлов установлены (важен порядок):
$TOOLKIT_DIR$\INC\
$TOOLKIT_DIR$\INC\DLIB\
Т.е. компилятор смотрит в $TOOLKIT_DIR$\INC\ находит там stdlib.h и собирает проект. А линкер выдает ошибку из-за рассмотренных в этой ветке выше причин. smile.gif

Вот так вот, горе от ума... cranky.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.