Я в программировании на Gcc полный ламер. Уже неделю бьюсь над какой то фигней. Проблема в следующем . Есть SDK для написания своих программ для однопроводных устройств 1-Wire для linuxa. Он состоит из набора *.c и *.h файлов. В нем есть файл примера в исходниках (temp.c) и компилированный (temp). Начало исходника (temp.c) следующее:
---------------------начало-------------------------------
#include <stdlib.h>
#include <stdio.h>
#include "ownet.h"
#include "temp10.h"
#include "findtype.h"
// defines
#define MAXDEVICES 20
// global serial numbers
uchar FamilySN[MAXDEVICES][8];
// variables
int family_code;
//----------------------------------------------------------------------
// Main Test for DS1920/DS1820 temperature measurement
//
int main(int argc, char **argv)
{
float current_temp;
int i = 0;
//----------------------------------------
// Introduction header
printf("\n/---------------------------------------------\n");
и т.д.
---------------------конец-------------------------------
Компилированые, понятное дело, нормально работают, а когда я пытаюсь скомпилировать исходник “gcc temp.c” то выдаются ошибки компиляции
---------------------начало-------------------------------
tmp/ccUfH90Q.o: In function 'main':
temp.c:(.text+0x88): undefined reference to 'ouflcquireEx'
temp.c:(.text+OxaO): undefined reference to 'ouFrintErrorMsg'
temp.c:(.text+0xa5): undefined reference to 'ouHasErrors'
и т.д.
---------------------конец-------------------------------
Все файлы которые указанны в incude я положил в каталог с исходником (temp.c) я пробовал копировать и все файлы из SDK но эффекта 0. Я понимаю что проблема в том что я не указал компилятору какие то пути или надо еще что то не сделал с файлами которые были в SDK (там, кстати, есть makefile который я запустил он понаделал из *.c файлов *.o файлов). Вот только что никак не пойму. Подскажите, пожалуйста, где поковырять. Уже неделю ничего не могу найти.
Упс. Невнимательно прочитал твой пост. Посмотри присутствуют ли определения функций, на которые ругается линкер, в заголовочных файлах.
>Проблема в том, что тебе также необходимо скомпилировать сам SDK, а не
>только тестовый пример. Если в SDK есть Makefile, попробуй использовать make.
>Если нет (что очень странно), попробуй скормить gcc все *.c файлы
>вместе с temp.c.
Макеашду есть и я сделал make all. Он что то компилировал насоздавал файлов с расширением *.o. Но компиляции temp.c так и не происходит даже в директории с SDK.
>Макеашду есть и я сделал make all. Он что то компилировал насоздавал
>файлов с расширением *.o. Но компиляции temp.c так и не происходит
>даже в директории с SDK.В таком случае нужно указать gcc еще все *.o файлы. Например:
gcc -o temp temp.c *.o
>Упс. Невнимательно прочитал твой пост. Посмотри присутствуют ли определения функций, на которые
>ругается линкер, в заголовочных файлах.Упоминания есть в файле ownet.h но почемуто к этому файлу нет ownet.c файла. Зато эти функции есть в других С-файлах SDK.
кусок из ownet.h
------------------------начало-----------------------------
// Error handling
extern int owHasErrors(void); //На нее ругается линкер.
// ioutil.c functions prototypes
int key_abort(void); //На нее ругается линкер.
// external One Wire functions defined in owsesu.c
int owAcquireEx(char *port_zstr); //На нее ругается линкер.
------------------------конец-----------------------------
пробовал эти файлы копировать в папку с temp.c не помогает. Кстати почти во всех файлах идет #include <ownet.h> он наверное за "главного".. :-)
Кстати, уверен что тебе нужно компилить с помощью gcc, а не sdcc?
>Кстати, уверен что тебе нужно компилить с помощью gcc, а не sdcc?
Нет не уверен. А это, что, какой то другой компилятор?
>>Кстати, уверен что тебе нужно компилить с помощью gcc, а не sdcc?
>Нет не уверен. А это, что, какой то другой компилятор?sdcc - Small Device(s) C Compiler
то что ты описал очень похоже на пример из этого sdcc
>>>Кстати, уверен что тебе нужно компилить с помощью gcc, а не sdcc?
>>Нет не уверен. А это, что, какой то другой компилятор?
>
>sdcc - Small Device(s) C Compiler
>то что ты описал очень похоже на пример из этого sdcc
Вот кусок readMe.txt Makefile к SDK может поможет понять какой компилятор.
README.TXT
---------------------начало----------------------------------
1-Wire Public Domain KitUSerial Build for Linux
Version 3.00Introduction
------------This port was targeted for and tested on a RedHat Linux X86 machine.
The provided makefile will build all of the example programs distributed
in the 3.00 1-Wire Public Domain release.Must specify target link file on the command line, i.e.:
make all LINKFILE=win32lnk.o
make atodtst LINKFILE=linuxlnk.o
make temp LINKFILE=myWeirdOSlnk.cor, call make with either of the following two targets
specified, 'win32' or 'linux':make win32
make linuxThis will cause the make file to use the default link
file for the target platform and build all applications.For documentation on the examples and the 1-Wire Public Domain
kit in general please see the 'main' kit:
http://www.ibutton.com/software/1wire/wirekit.htmlExamples
--------
tempTool Versions
-------------$ make -version
GNU Make version 3.77, by Richard Stallman and Roland McGrath.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98
Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.$ gcc -dumpversion
egcs-2.91.66$ gcc -dumpmachine
i386-redhat-linuxGeneral Notes
-------------- Relevant 1-Wire Information:
http://www.ibutton.com
http://www.maxim-ic.com/- 1-Wire Mailing List:
http://lists.dalsemi.com/mailman/listinfo/1-wire-software-de...
---------------------конец----------------------------------MAKEFILE
---------------------начало----------------------------------
#
# Must specify target link file on the command line, i.e.:
#
# make all LINKFILE=win32lnk.o
# make atodtst LINKFILE=linuxlnk.o
# make temp LINKFILE=myWeirdOSlnk.c
#
# or, call make with either of the following two targets
# specified, 'win32' or 'linux':
#
# make win32
# make linux
#
# This will cause the make file to use the default link
# file for the target platform and build all applications.
#CC = gcc
# Cygwin flags
#CFLAGS = -mno-cygwin -DDEBUG -c
#LFLAGS = -mno-cygwin -DDEBUG -g -o $@
---------------------конец----------------------------------
>>>Кстати, уверен что тебе нужно компилить с помощью gcc, а не sdcc?
>>Нет не уверен. А это, что, какой то другой компилятор?
>
>sdcc - Small Device(s) C Compiler
>то что ты описал очень похоже на пример из этого sdccВроде разобрался. Подсматрел в makefile который идет с SDK. Там делается следующим образом GCC -DDEBUG -g -o temp temp.c temp10.o findtype.o и еще дохрена всяких *.o
А до этого делаются:
GCC -DDEBUG -с temp10.c
и т.д. т.е. создаются эти самые *.o
И что неужели так всегда и надо компилировать??? Охринеть...
>Вроде разобрался. Подсматрел в makefile который идет с SDK. Там делается следующим
>образом GCC -DDEBUG -g -o temp temp.c temp10.o findtype.o и еще
>дохрена всяких *.o
>А до этого делаются:
>GCC -DDEBUG -с temp10.c
>и т.д. т.е. создаются эти самые *.o
>
>И что неужели так всегда и надо компилировать??? Охринеть...Для этого и нужен makefile.
C этим я разобрался боле-менее. Но возникла другая загвоздка. Если я пробую компилировать в Linux SuSe 10 то все нормально, а если же пытаюсь сделать тоже самое во FreeBSD 6.1 то ничего не получается. GCC стоит свежий и там и там. Я догадываюсь что проблемма в том что в Linuxe есть какие то пакеты которых нет во FreeBSD. Можно как то узнать чего не хватает, из пакетов, FreeBSD?
часть выдаваемых ошибок
------------------начало--------------------
syntax error before "ulong"
syntax error before "ushort"
------------------конец--------------------
строки на которую ругается компилер
------------------начало--------------------
int EnterHex(char *msg, int numchars, ulong *value);
void setcrc16(int portnum, ushort reset);
------------------конец--------------------
как я понял в вызываемой функции есть параметры не извесных системе типов. Но почему тогда в Linuxe все нормально. Кстати бинарники скомпилированые в Linuxe идут и во FreeBSD, правда только после того как я скачал и установил пакэдж скомпилированной библиотеки для этих устройств (для FreeBSD). Так и должно быть?
>syntax error before "ulong"
>syntax error before "ushort"ulong и ushort это нестандартные для C типы. Они определены в заголовочных файлах Linux'a, а в FreeBSD нет. Решить это можно добалением в самый главный заголовочный файл этого SDK подобных строчек:
#ifdef __FreeBSD__
typedef unsigned short ushort;
typedef unsigned long ulong;
#endif>...Кстати бинарники скомпилированые в
>Linuxe идут и во FreeBSD, правда только после того как я
>скачал и установил пакэдж скомпилированной библиотеки для этих устройств (для FreeBSD).
>Так и должно быть?Да. FreeBSD может выполнять программы скомпилированные для Linux. Но не наоборот.
>>syntax error before "ulong"
>>syntax error before "ushort"
>
>ulong и ushort это нестандартные для C типы. Они определены в заголовочных
>файлах Linux'a, а в FreeBSD нет. Решить это можно добалением в
>самый главный заголовочный файл этого SDK подобных строчек:
>
>#ifdef __FreeBSD__
> typedef unsigned short
> ushort;
> typedef unsigned long
> ulong;
>#endif
>
>
Большое спасибо за подсказку.... :-) Теперь дело пойдет быстрее... :-)>>...Кстати бинарники скомпилированые в
>>Linuxe идут и во FreeBSD, правда только после того как я
>>скачал и установил пакэдж скомпилированной библиотеки для этих устройств (для FreeBSD).
>>Так и должно быть?
>
>Да. FreeBSD может выполнять программы скомпилированные для Linux. Но не наоборот.
Даже без linux-base пакета?
Еще один вопрос. Как указать компилятору путь к каталогу с SDK? А то как то неудобно работать в каталоге с SDK.
>Еще один вопрос. Как указать компилятору путь к каталогу с SDK?Для gcc это -I для хедеров и -L для библиотек.
Вот кусок readMe.txt Makefile к SDK может поможет.
README.TXT
---------------------начало----------------------------------
1-Wire Public Domain KitUSerial Build for Linux
Version 3.00Introduction
------------This port was targeted for and tested on a RedHat Linux X86 machine.
The provided makefile will build all of the example programs distributed
in the 3.00 1-Wire Public Domain release.Must specify target link file on the command line, i.e.:
make all LINKFILE=win32lnk.o
make atodtst LINKFILE=linuxlnk.o
make temp LINKFILE=myWeirdOSlnk.cor, call make with either of the following two targets
specified, 'win32' or 'linux':make win32
make linuxThis will cause the make file to use the default link
file for the target platform and build all applications.For documentation on the examples and the 1-Wire Public Domain
kit in general please see the 'main' kit:
http://www.ibutton.com/software/1wire/wirekit.htmlExamples
--------
tempTool Versions
-------------$ make -version
GNU Make version 3.77, by Richard Stallman and Roland McGrath.
Copyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98
Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.$ gcc -dumpversion
egcs-2.91.66$ gcc -dumpmachine
i386-redhat-linuxGeneral Notes
-------------- Relevant 1-Wire Information:
http://www.ibutton.com
http://www.maxim-ic.com/- 1-Wire Mailing List:
http://lists.dalsemi.com/mailman/listinfo/1-wire-software-de...
---------------------конец----------------------------------MAKEFILE
---------------------начало----------------------------------
#
# Must specify target link file on the command line, i.e.:
#
# make all LINKFILE=win32lnk.o
# make atodtst LINKFILE=linuxlnk.o
# make temp LINKFILE=myWeirdOSlnk.c
#
# or, call make with either of the following two targets
# specified, 'win32' or 'linux':
#
# make win32
# make linux
#
# This will cause the make file to use the default link
# file for the target platform and build all applications.
#CC = gcc
# Cygwin flags
#CFLAGS = -mno-cygwin -DDEBUG -c
#LFLAGS = -mno-cygwin -DDEBUG -g -o $@
---------------------конец----------------------------------