Получение ошибок компиляции при наличии сторонней библиотеки - PullRequest
1 голос
/ 12 февраля 2012
#include<stdio.h>
#include "flite.h"
cst_voice *register_cmu_us_kal();
int main()
{
 cst_voice *v;
 cst_wave *w;
 char *text = "Hello world programming";

 //Initialising the flite variables used
 flite_init();
 w = new_wave();

 v = register_cmu_us_kal(NULL);
 flite_text_to_speech(text,v,"hello_wave");

 if(cst_wave_load_riff(w,"hello_wave")!=CST_OK_FORMAT){
  printf("\nCompare_wave:Can read file or wrong format!\n");
 }
 else{
  play_wave(w);
 }
 return 0;
}

Makefile

all:compile \
  ./compile
compile:eg1.o
  gcc -o $@ eg1.o 
eg1.o:eg1.c $(LIBS_DIR) $(INC_DIR) $(LIBS)
  gcc -c $<
LIBS_DIR = -L /home/b/flite-1.4-release/build/i386-linux-gnu/lib
INC_DIR = -I /home/b/flite-1.4-relase/include
LIBS = -lflite_cmu_us_slt -lflite -lflite_cmulex -lflite_cmu_time_awb -lflite_cmu_us_kal16 -lflite_cmu_us_kal -lflite_cmu_usenglish
INCLUDE:
clean:
  rm -f *.o






I tried by giving he library and header file paths as LIBS_DIR = ../build/i386-linux-gnu/lib and INC_DIR = ../include

Я попробовал следующую программу c, включив стороннюю библиотеку. Эта программа и файл сборки находятся в папке b \ flite-1.4-release \ Learnin_ Хотя_example. Библиотеки flite находятся в b \ flite-1.4-release \ build \ i386-linux-gnu \ lib, а заголовочные файлы находятся в b \ flite-1.4-release \ include.

Я предполагаю, что я дал make-файлу правильный путь для поиска файлов. Но это не определить в нем, и я получаю ошибку, как,

make clean all
rm -f *.o
gcc -c eg1.c
eg1.c:2:19: error: flite.h: No such file or directory
eg1.c:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
eg1.c: In function ‘main’:
eg1.c:6: error: ‘cst_voice’ undeclared (first use in this function)
eg1.c:6: error: (Each undeclared identifier is reported only once
eg1.c:6: error: for each function it appears in.)
eg1.c:6: error: ‘v’ undeclared (first use in this function)
eg1.c:7: error: ‘cst_wave’ undeclared (first use in this function)
eg1.c:7: error: ‘w’ undeclared (first use in this function)
eg1.c:17: error: ‘CST_OK_FORMAT’ undeclared (first use in this function)
make: *** [eg1.o] Error 1

Пожалуйста, помогите мне понять, какую ошибку я совершаю

РЕДАКТИРОВАНИЕ:

Я модифицировал этот make-файл в соответствии с указаниями Мэтта:

all:compile
compile:eg1.o
  gcc $(INC_DIR) $(LIB_DIR) -o $@ $^ $(LIBS) 
eg1.o:eg1.c
  gcc $(INC_DIR) -o $@ -c $^
LIBS_DIR = -L../build/i386-linux-gnu/lib
INC_DIR = -I../include
LIBS = -lflite -lflite_cmulex -lflite_cmu_time_awb -lflite_cmu_us_kal16 -lflite_cmu_us_kal -lflite_cmu_usenglish -lflite_cmu_us_slt
clean:
  rm -f *.o

но я получаю ошибку ifferent, которая скомпилирована с командой "make clean all", как,

rm -f *.o
gcc -I../include -o eg1.o -c eg1.c
gcc -I../include  -o compile eg1.o -lflite -lflite_cmulex -lflite_cmu_time_awb -lflite_cmu_us_kal16 -lflite_cmu_us_kal -lflite_cmu_usenglish -lflite_cmu_us_slt 
/usr/bin/ld: cannot find -lflite
collect2: ld returned 1 exit status
make: *** [compile] Error 1

РЕДАКТИРОВАНИЕ:

rm -f *.o
gcc -I../include -o eg1.o -c eg1.c
gcc -I../include -L../build/i386-linux-gnu/lib -o compile eg1.o -lflite -lflite_cmulex -lflite_cmu_time_awb -lflite_cmu_us_kal16 -lflite_cmu_us_kal -lflite_usenglish -lflite_cmu_us_slt -lflite_cmu_us_rms 
../build/i386-linux-gnu/lib/libflite.so: undefined reference to `sin'
../build/i386-linux-gnu/lib/libflite.so: undefined reference to `exp'
../build/i386-linux-gnu/lib/libflite.so: undefined reference to `sqrt'
../build/i386-linux-gnu/lib/libflite.so: undefined reference to `log'
../build/i386-linux-gnu/lib/libflite.so: undefined reference to `fmod'
../build/i386-linux-gnu/lib/libflite.so: undefined reference to `pow'

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

Ваш make-файл, я боюсь сказать, полностью поврежден.

Основной синтаксис Makefile:

target: pre-requisite(s)
<tab>Stuff to do to build target from pre-reqs (if required)

Так что это неправильно, eg1.o не может бытьпредварительное условие для построения самого себя.

compile:eg1.o
  gcc -o eg1.o 

Вы должны иметь:

eg1.o: eg1.c
  gcc $(INC_DIR) -o $@ -c $^

($@ является целью, $^ все предварительные требования.)

Тогда вы можете:

myexe: eg1.o
  gcc $(INC_DIR) $(LIBS_DIR) -o $@ $^ $(LIBS)

Это даст myexe из eg1.o.И ваше all правило должно быть all: myexe, без рецепта (без команд) и в самом верху, как оно есть.

Тогда вы перепутали свои каталоги включения и каталоги библиотеки.-I для путей включения, -L для путей к библиотекам.

Поместите определения переменных перед правилами, это более распространено / обычно.И не ставьте пробел между -L / -I и путем, который следует за ним.

1 голос
/ 12 февраля 2012

включает каталоги для поиска задается флагом -I, а не -L.

Изменение:

LIBS_DIR = -I /home/b/flite-1.4-release/build/i386-linux-gnu/lib
INC_DIR = -L /home/b/flite-1.4-relase/include

на:

LIBS_DIR = -L /home/b/flite-1.4-release/build/i386-linux-gnu/lib
INC_DIR = -I /home/b/flite-1.4-relase/include
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...