Перейти к содержанию
    

работает ли в таком виде..

В таком чё-то никак...

Немного изменил описание структуры - вот:

post-33646-1223277854_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эврика! Теперь работает... а я использовал всегда именованные струтуры... потому и неработало)))

Премного благодарен уважаемый... я б об этом думал бы в последнюю очередь... еслиб догадался)))

Теперь CodeBlocks для меня стала нормальной средой, а не просто бесплатным продуктом)))

Изменено пользователем Григорий2000

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, кто-нибудь пользуется автогенерацией makefile или все используют свой внешний makefile ?

Что то у меня не получилось скомпилировать проект из неодного исходника, с одним компилирует а с неодним неполучается - линкер берет только один объектный файл, и , соответственно, пишет что ненайдены внешние обьекты(функции/переменные).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поставьте в настройках галочки на все предупреждения, тогда будет видно, из-за чего не линкует. Ещё, если проект разложен по папкам, надо либо прописывать компилятору и линкеру пути для поиска к каждой папке, но это лениво, я прописываю путь к корню проекта, а в исходниках прописываю полные относительные пути к хедерам, типа #include "../utils/utils.h"

Таким образом работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

варнинги вывел... появились предупреждения о коментах типа с++ в файлах С90 и т.п

компиляция проходит, хедеры все доступны, файлы для чистоты эксперимента свалил в одну папку.

не вижу что-бы линкеру передавались все файлы проекта, передается только один(как нибудь можно вывести в консоль запуск линкера с ключами, что-бы посмотреть как это делает среда?) и естественно если он один у линкера - ошибки - нет обьектов объявленных там как extern или внешних функций.

Compiling: ..\Lib\DELAY.C

Compiling: ..\Lib\buffer.c

..\Lib\buffer.c:2:1: warning: C++ style comments are not allowed in ISO C90

..\Lib\buffer.c:2:1: warning: (this will be reported only once per input file)

In file included from ..\Lib\buffer.c:18:

..\Lib\/buffer.h:2:1: warning: C++ style comments are not allowed in ISO C90

..\Lib\/buffer.h:2:1: warning: (this will be reported only once per input file)

In file included from ..\Lib\buffer.c:21:

..\Lib\/avrlibdefs.h:2:1: warning: C++ style comments are not allowed in ISO C90

..\Lib\/avrlibdefs.h:2:1: warning: (this will be reported only once per input file)

..\Lib\buffer.c: In function 'bufferGetAtIndex':

..\Lib\buffer.c:101: warning: ISO C90 forbids mixed declarations and code

..\Lib\buffer.c: In function 'bufferIsNotFull':

..\Lib\buffer.c:135: warning: ISO C90 forbids mixed declarations and code

Compiling: ..\Lib\ds18b20.c

..\Lib\ds18b20.c:3:1: warning: C++ style comments are not allowed in ISO C90

..\Lib\ds18b20.c:3:1: warning: (this will be reported only once per input file)

In file included from ..\Lib\ds18b20.c:5:

..\Lib\/..\Lib\1WIRE.H:7:25: warning: C++ style comments are not allowed in ISO C90

..\Lib\/..\Lib\1WIRE.H:7:25: warning: (this will be reported only once per input file)

In file included from ..\Lib\ds18b20.c:6:

..\Lib\/ds18b20.h:11:1: warning: C++ style comments are not allowed in ISO C90

..\Lib\/ds18b20.h:11:1: warning: (this will be reported only once per input file)

Compiling: main.c

In file included from main.c:6:

..\Lib\ds18b20.h:11:1: warning: C++ style comments are not allowed in ISO C90

..\Lib\ds18b20.h:11:1: warning: (this will be reported only once per input file)

main.c:14:1: warning: C++ style comments are not allowed in ISO C90

main.c:14:1: warning: (this will be reported only once per input file)

Compiling: ..\Lib\1WIRE.C

Linking console executable: bin\Debug\testProject.elf

obj\Debug\Lib\ds18b20.o: In function `ds18b20Init':

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:91: undefined reference to `w1_rom_search'

obj\Debug\Lib\ds18b20.o: In function `ds1820StartConversion':

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:139: undefined reference to `w1_reset'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:151: undefined reference to `w1_command'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:154: undefined reference to `w1_command'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:157: undefined reference to `w1_command'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:160: undefined reference to `w1_command'

obj\Debug\Lib\ds18b20.o: In function `ds1820ReadTemperature':

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:199: undefined reference to `w1_reset'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:209: undefined reference to `w1_bit_io'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:218: undefined reference to `w1_reset'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:231: undefined reference to `w1_command'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:236: undefined reference to `w1_command'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:242: undefined reference to `w1_command'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:247: undefined reference to `w1_command'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:254: undefined reference to `w1_byte_rd'

C:\work\TestFolder\testProject/..\Lib\ds18b20.c:255: undefined reference to `w1_byte_rd'

Process terminated with status 1 (0 minutes, 1 seconds)

15 errors, 18 warnings

 

где ошибка?)) в каких настройках

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Внизу есть вкладка Build Log, в неё можно вывести подробный лог со всеми командами, ключами и т.д. и даже сохранить его в файл. В настройках где-то есть соответственная галка.

Вот пример:

X3_amplifier_build_log.html

 

А вот нужные галки:

post-33646-1227686113_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, спасибо, уже нашел где это включить...

и, как оказалось, линкеру передаются все файлы. Однако, немогу понять во первых почему линкуется другим файлом, обычно компилер и линкер - один и тот-же файл

avr-gcc.exe -mmcu=atmega128 -Wall -DF_CPU=16000000UL -mmcu=atmega128 -g -Os -g -IC:\work\TestFolder\testProject\ -IC:\WinAVR\avr\include -c ds18b20.c -o obj\Debug\ds18b20.o

avr-gcc.exe -mmcu=atmega128 -Wall -DF_CPU=16000000UL -mmcu=atmega128 -g -Os -g -IC:\work\TestFolder\testProject\ -IC:\WinAVR\avr\include -c main.c -o obj\Debug\main.o

avr-gcc.exe -mmcu=atmega128 -Wall -DF_CPU=16000000UL -mmcu=atmega128 -g -Os -g -IC:\work\TestFolder\testProject\ -IC:\WinAVR\avr\include -c 1WIRE.C -o obj\Debug\1WIRE.o

avr-g++.exe -Lobj\Debug -Lobj\Debug\Lib -LC:\WinAVR\avr\lib -o bin\Debug\testProject.elf obj\Debug\DELAY.o obj\Debug\buffer.o obj\Debug\ds18b20.o obj\Debug\main.o obj\Debug\1WIRE.o -mmcu=atmega128 -Wl,-Map=bin\Debug\testProject.elf.map,--cref

obj\Debug\ds18b20.o: In function `ds1820StartConversion':

C:\work\TestFolder\testProject/ds18b20.c:139: undefined reference to `w1_reset'

C:\work\TestFolder\testProject/ds18b20.c:157: undefined reference to `w1_command'

C:\work\TestFolder\testProject/ds18b20.c:160: undefined reference to `w1_command'

obj\Debug\ds18b20.o: In function `ds1820ReadTemperature':

C:\work\TestFolder\testProject/ds18b20.c:199: undefined reference to `w1_reset'

C:\work\TestFolder\testProject/ds18b20.c:209: undefined reference to `w1_bit_io'

C:\work\TestFolder\testProject/ds18b20.c:218: undefined reference to `w1_reset'

C:\work\TestFolder\testProject/ds18b20.c:247: undefined reference to `w1_command'

C:\work\TestFolder\testProject/ds18b20.c:254: undefined reference to `w1_byte_rd'

C:\work\TestFolder\testProject/ds18b20.c:255: undefined reference to `w1_byte_rd'

obj\Debug\ds18b20.o: In function `ds18b20Init':

C:\work\TestFolder\testProject/ds18b20.c:91: undefined reference to `w1_rom_search'

Process terminated with status 1 (0 minutes, 1 seconds)

10 errors, 0 warnings

и в принципе видно, что проблема только в этом файле.

Интересен порядок использования файлов.

изменение линкера результата не дало...

проблема где-то в моих проектах,

на тестовом проекте работает нормально

Изменено пользователем Григорий2000

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Небольшой вопрос.

Возможно ли чтоб по нажатию кнопки Run осуществлялось программирование контроллера?

Сейчас я прошиваю контроллер через макрос в makefile ( т.е. в консоли пишу make prog, где prog это имя макроса ). Частично решил проблему с помощью Tools -> Configure tools... , но там нельзя назначить сочетания клавиш для автоматического запуска, да и кнопка Run оказалась незадействованной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет, Григорий2000!

C:\work\TestFolder\testProject/ds18b20.c:139: undefined reference to `w1_reset'

Глупый вопрос: а ты абсолютно уверен, что `w1_reset' и прочие ненаходимые линкером символы имеются в переданных ему для линковки модулях? Что на этот счет говорит nm?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет, Григорий2000!

Глупый вопрос: а ты абсолютно уверен, что `w1_reset' и прочие ненаходимые линкером символы имеются в переданных ему для линковки модулях? Что на этот счет говорит nm?

уверен на 220%

я не понял в чем проблема, но все решилось простым образом. у меня в проекте были как с так и cpp файлы. как только я переименовал ds18b20 в cpp все скомпилировалось. разбираться в причине не стал, но был-бы признателен за пояснения произошедшего. и я совсем "некопенгаген" что такое nm..(простите мне мое невежество)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

уверен на 220%

я не понял в чем проблема, но все решилось простым образом. у меня в проекте были как с так и cpp файлы. как только я переименовал ds18b20 в cpp все скомпилировалось. разбираться в причине не стал, но был-бы признателен за пояснения произошедшего. и я совсем "некопенгаген" что такое nm..(простите мне мое невежество)

Ответ тут получается очень простым.

Если вы используете функции написанные на С в программе на С++, то её (функцию) необходимо обьявить как extern "C". Это всё надо так как компилятор С++ добавляет префиксы и постфиксы к именам всех функций что б различать перегруженные, а компилятор С - нет (как это называется по научному - извините не помню).

 

Универсальный подход к такому вопросу такой: во все заголовочные файлы добавляйте такие макросы

#ifndef SOME_HEADER_H
#define SOME_HEADER_H

#ifdef __cplusplus
extern "C" {
#endif

// тут обьявлены функции

#ifdef __cplusplus
}
#endif

#endif //SOME_HEADER_H

 

nm утилита из набора binutils для вывода всех символов, обьявленных в обьектном файле, например

nm ds18b20.o

выдаст список всех имён функций и не только в этом файле. Если вы откомпилируете один и тот же исходник компилятором С и С++, и посмотрите на имена функций - поймете разницу и почему линкер не находил функций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А линкер-то g++ используется или gcc?

avr-g++.exe -Lobj\Debug -Lobj\Debug\Lib -LC:\WinAVR\avr\lib -o bin\Debug\testProject.elf obj\Debug\DELAY.o obj\Debug\buffer.o obj\Debug\ds18b20.o obj\Debug\main.o obj\Debug\1WIRE.o -mmcu=atmega128 -Wl,-Map=bin\Debug\testProject.elf.map,--cref obj\Debug\ds18b20.o: In function `ds1820StartConversion':

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

C выводом обьявлений функций как

 

#ifdef __cplusplus

extern "C" {

#endif

 

все успешно линкуется.

незапоминаю решения в котрых непонятен принцип действия.

С этим ответом встало все на свои места...

 

используется линкер g++(поумолчанию)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот не могу понять. Запускаю objdump из-под сабжа- что ни делаю, он дамп выдает в stderr. Наблюдаю в окне build вместо файла. Блин, мозг сломал... не понимаю Подскажите, плз, что делать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...