包含第三方库时出现编译错误

发布于 2025-01-05 02:50:31 字数 3578 浏览 0 评论 0原文

#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 程序。该程序和 makefile 位于 b\flite-1.4-release\Learnin_though_example 文件夹中。 flite 库位于 b\flite-1.4-release\build\i386-linux-gnu\lib 中,头文件位于 b\flite-1.4-release\include 中。

我假设我已经为 makefile 提供了搜索文件的正确路径。但它没有识别出来,我遇到了一个错误,

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

请帮助我理解我在做什么错误

编辑:

我按照马特的指导修改了makefile:

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

但我得到了不同的结果使用命令“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'
#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 
lt;
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

I tried the folowing c program by including a third party library. This program an a makefile is located in b\flite-1.4-release\Learnin_though_example folder. Th flite libraries are located in b\flite-1.4-release\build\i386-linux-gnu\lib and the header files are in b\flite-1.4-release\include .

I assume that i have given the makefile th correct path to search for the files. But its not identifyin it and i'm gettin an error as,

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

Please help me understand what is the mistake i'm doing

EDITED:

I modiied th makefile as per matt's guidance:

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

but i'm getting ifferent error whn compiled with the command "make clean all" as,

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

EDITED:

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'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

可可 2025-01-12 02:50:31

恐怕你的 makefile 已经完全损坏了。

基本的 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 及其后面的路径之间放置空格。

Your makefile is, I'm afraid to say, completely broken.

The basic Makefile syntax is:

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

So this is wrong, eg1.o can't be a pre-requisite for building itself.

compile:eg1.o
  gcc -o eg1.o 

You should have:

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

($@ is the target, $^ all the pre-reqs.)

Then you can:

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

This will produce myexe from eg1.o. And your all rule should be all: myexe, with no recipe (no commands), and at the top as you have it.

Then you've got your include directories and library directories mixed up. -I is for include paths, -L for library paths.

Place your variable definitions before the rules, that's more common/usual. And don't put a space between -L/-I and the path that follows it.

定格我的天空 2025-01-12 02:50:31

要搜索的包含目录-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

The include directories to search is specified by -I flag, not -L.

Change:

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

to:

LIBS_DIR = -L /home/b/flite-1.4-release/build/i386-linux-gnu/lib
INC_DIR = -I /home/b/flite-1.4-relase/include
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文