Pocketsphinx-使用Makefile链接/包含库的正确方法是什么?

Pocketsphinx-使用Makefile链接/包含库的正确方法是什么?,c,makefile,path,cmusphinx,pocketsphinx,C,Makefile,Path,Cmusphinx,Pocketsphinx,我正在做一个第一次使用pocketsphinx的项目,在编译我的程序时遇到了很多麻烦。自从尼古拉帮我指出问题所在后,我对这个问题进行了一些编辑,但我仍然无法编译我的程序 我曾试图将pocketsphinx文档中的编译标志分开,以使它们对Makefile友好,但我一定是把它们放错地方了。我得到一个错误: src/server/server.c:41:20: error: use of undeclared identifier 'MODELDIR'

我正在做一个第一次使用pocketsphinx的项目,在编译我的程序时遇到了很多麻烦。自从尼古拉帮我指出问题所在后,我对这个问题进行了一些编辑,但我仍然无法编译我的程序

我曾试图将pocketsphinx文档中的编译标志分开,以使它们对Makefile友好,但我一定是把它们放错地方了。我得到一个错误:

src/server/server.c:41:20: error: use of undeclared identifier 'MODELDIR'
                         "-hmm", MODELDIR "/en-us/en-us",
                                 ^
1 error generated.
我想共享我的server.c,但错误消息告诉我错误不在我的文件中——一定是某些东西链接不正确,因为我应该能够使用
MODELDIR

此时,我猜测我将
-DMODELDIR=\“$(MODELDIR)\”
放在了错误的位置。我一直在谷歌上搜索,但我找不到任何解释在哪里放置
-DMODELDIR=\“$(MODELDIR)\”

以下是我在Makefile中声明
MODELDIR
变量的方式:

NAME_CL = client
NAME_SV = server
CFLAGS = -Wall -Werror -Wextra -g
MODELDIR = $(shell pkg-config --variable=modeldir pocketsphinx)
SPHX_FLAGS = $(shell pkg-config --cflags pocketsphinx sphinxbase)
SPHX_LIBS = $(shell pkg-config --libs pocketsphinx sphinxbase)

# SV - Server specific files
# CL - Client specific files
# HL - Files containing helper functions used in both client and server
# CM - Files with commands to be executed by server

SRC_SV = server.c
SRC_CL = client.c
SRC_HL = network_helpers.c
SRC_CM = example.c

OBJ_CL_FILES = $(SRC_CL:.c=.o)
OBJ_SV_FILES = $(SRC_SV:.c=.o)
OBJ_HL_FILES = $(SRC_HL:.c=.o)
OBJ_CM_FILES = $(SRC_CM:.c=.o)

HL_DIR = ./src/helpers/
CL_DIR = ./src/client/
SV_DIR = ./src/server/
CM_DIR = ./src/server/cmds/
OBJ_DIR = ./obj/
OBJ_CL_DIR = ./obj/client/
OBJ_CM_DIR = ./obj/server/
OBJ_SV_DIR = ./obj/server/
OBJ_HL_DIR = ./obj/helpers/
INC_DIR = ./include/
LIBFT_DIR = ./libft/
SPHX_DIR = ./cmusphinx/

OBJ_CL = $(addprefix $(OBJ_CL_DIR), $(OBJ_CL_FILES))
OBJ_SV = $(addprefix $(OBJ_SV_DIR), $(OBJ_SV_FILES))
OBJ_HL = $(addprefix $(OBJ_HL_DIR), $(OBJ_HL_FILES))
OBJ_CM = $(addprefix $(OBJ_SV_DIR), $(OBJ_CM_FILES))
LIBFT = $(addprefix $(LIBFT_DIR), libft.a)

LINK = -L $(LIBFT_DIR) -lft $(SPHX_LIBS)

all: obj $(LIBFT) $(NAME_CL) $(NAME_SV)

obj:
    @mkdir -p $(OBJ_CL_DIR)
    @mkdir -p $(OBJ_SV_DIR)
    @mkdir -p $(OBJ_HL_DIR)

$(OBJ_CL_DIR)%.o:$(CL_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) $(SPHX_FLAGS) -o $@ -c $<

$(OBJ_SV_DIR)%.o:$(SV_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) $(SPHX_FLAGS) -o $@ -c $<

$(OBJ_HL_DIR)%.o:$(HL_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) $(SPHX_FLAGS) -o $@ -c $<

$(OBJ_CM_DIR)%.o:$(CM_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) $(SPHX_FLAGS) -o $@ -c $<

$(LIBFT):
    @echo "\033[32mCompiling libft...\033[0m"
    @make -C $(LIBFT_DIR)
    @echo "\033[1;4;32m[\xE2\x9C\x94] libft created.\033[0m\n"

$(NAME_CL): $(OBJ_CL) $(OBJ_HL)
    @echo "\033[32mCompiling $(NAME_CL)...\033[0m"
    @gcc $(OBJ_HL) $(OBJ_CL) $(LINK) -lm -o $(NAME_CL)
    @echo "\033[1;4;32m[\xE2\x9C\x94] $(NAME_CL) Created.\033[0m\n"

$(NAME_SV): $(OBJ_SV) $(OBJ_HL) $(OBJ_CM)
    @echo "\033[32mCompiling $(NAME_SV)...\033[0m"
    @gcc $(OBJ_SV) $(OBJ_HL) $(OBJ_CM) $(LINK) -DMODELDIR=\"$(MODELDIR)\" $(SPHX_LIBS) -lm -o $(NAME_SV)
    @echo "\033[1;4;32m[\xE2\x9C\x94] $(NAME_SV) Created.\033[0m\n"

clean:
    @echo "\033[31mRemoving source objects...\033[0m"
    @rm -rf $(OBJ_DIR)
    @echo "\033[4;31m[\xE2\x9D\x8C ] Source objects removed!\033[0m\n"
    @echo "\033[31mRemoving libft objects...\033[0m"
    @make -C $(LIBFT_DIR) clean
    @echo "\033[4;31m[\xE2\x9D\x8C ] libft Objects removed!\033[0m\n"
    @echo "\033[1;4;91m-----All objects removed!-----\033[0m\n"

clean_client:
    @echo "\033[31mRemoving client objects...\033[0m"
    @rm -rf $(OBJ_CL_DIR)
    @rm -rf $(OBJ_HL_DIR)
    @make -C $(LIBFT_DIR) clean
    @echo "\033[4;31m[\xE2\x9D\x8C ] Client objects removed!\033[0m"

clean_server:
    @echo "\033[31mRemoving server objects...\033[0m"
    @rm -rf $(OBJ_SV_DIR)
    @rm -rf $(OBJ_HL_DIR)
    @make -C $(LIBFT_DIR) clean
    @echo "\033[4;31m[\xE2\x9D\x8C ] Server objects removed!\033[0m"

fclean: clean
    @echo "\033[31mRemoving $(NAME_CL)...\033[0m"
    @rm -f $(NAME_CL)
    @echo "\033[4;31m[\xE2\x9D\x8C ] $(NAME_CL) removed!\033[0m\n"
    @echo "\033[31mRemoving $(NAME_SV)...\033[0m"
    @rm -f $(NAME_SV)
    @echo "\033[4;31m[\xE2\x9D\x8C ] $(NAME_SV) removed!\033[0m\n"
    @echo "\033[31mRemoving libft objects and libft.a...\033[0m"
    @make -C $(LIBFT_DIR) fclean
    @echo "\033[4;31m[\xE2\x9D\x8C ] libft objects and libft.a removed!!\033[0m\n"
    @echo "\033[1;4;31m-----All objects, executables and lib files removed!-----\033[0m\n"

re: fclean all

.PHONY: clean clean_client clean_server fclean all re
MODELDIR=$(shell pkg config--variable=MODELDIR-pocketsphinx)

这就是我用它来编译的地方:

$(NAME_SV): $(OBJ_SV) $(OBJ_HL) $(OBJ_CM)
    @echo "\033[32mCompiling $(NAME_SV)...\033[0m"
    @gcc $(OBJ_SV) $(OBJ_HL) $(OBJ_CM) $(LINK) -DMODELDIR=\"$(MODELDIR)\" $(SPHX_LIBS) -lm -o $(NAME_SV)
    @echo "\033[1;4;32m[\xE2\x9C\x94] $(NAME_SV) Created.\033[0m\n"
对于透视图,这里是我的整个Makefile:

NAME_CL = client
NAME_SV = server
CFLAGS = -Wall -Werror -Wextra -g
MODELDIR = $(shell pkg-config --variable=modeldir pocketsphinx)
SPHX_FLAGS = $(shell pkg-config --cflags pocketsphinx sphinxbase)
SPHX_LIBS = $(shell pkg-config --libs pocketsphinx sphinxbase)

# SV - Server specific files
# CL - Client specific files
# HL - Files containing helper functions used in both client and server
# CM - Files with commands to be executed by server

SRC_SV = server.c
SRC_CL = client.c
SRC_HL = network_helpers.c
SRC_CM = example.c

OBJ_CL_FILES = $(SRC_CL:.c=.o)
OBJ_SV_FILES = $(SRC_SV:.c=.o)
OBJ_HL_FILES = $(SRC_HL:.c=.o)
OBJ_CM_FILES = $(SRC_CM:.c=.o)

HL_DIR = ./src/helpers/
CL_DIR = ./src/client/
SV_DIR = ./src/server/
CM_DIR = ./src/server/cmds/
OBJ_DIR = ./obj/
OBJ_CL_DIR = ./obj/client/
OBJ_CM_DIR = ./obj/server/
OBJ_SV_DIR = ./obj/server/
OBJ_HL_DIR = ./obj/helpers/
INC_DIR = ./include/
LIBFT_DIR = ./libft/
SPHX_DIR = ./cmusphinx/

OBJ_CL = $(addprefix $(OBJ_CL_DIR), $(OBJ_CL_FILES))
OBJ_SV = $(addprefix $(OBJ_SV_DIR), $(OBJ_SV_FILES))
OBJ_HL = $(addprefix $(OBJ_HL_DIR), $(OBJ_HL_FILES))
OBJ_CM = $(addprefix $(OBJ_SV_DIR), $(OBJ_CM_FILES))
LIBFT = $(addprefix $(LIBFT_DIR), libft.a)

LINK = -L $(LIBFT_DIR) -lft $(SPHX_LIBS)

all: obj $(LIBFT) $(NAME_CL) $(NAME_SV)

obj:
    @mkdir -p $(OBJ_CL_DIR)
    @mkdir -p $(OBJ_SV_DIR)
    @mkdir -p $(OBJ_HL_DIR)

$(OBJ_CL_DIR)%.o:$(CL_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) $(SPHX_FLAGS) -o $@ -c $<

$(OBJ_SV_DIR)%.o:$(SV_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) $(SPHX_FLAGS) -o $@ -c $<

$(OBJ_HL_DIR)%.o:$(HL_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) $(SPHX_FLAGS) -o $@ -c $<

$(OBJ_CM_DIR)%.o:$(CM_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) $(SPHX_FLAGS) -o $@ -c $<

$(LIBFT):
    @echo "\033[32mCompiling libft...\033[0m"
    @make -C $(LIBFT_DIR)
    @echo "\033[1;4;32m[\xE2\x9C\x94] libft created.\033[0m\n"

$(NAME_CL): $(OBJ_CL) $(OBJ_HL)
    @echo "\033[32mCompiling $(NAME_CL)...\033[0m"
    @gcc $(OBJ_HL) $(OBJ_CL) $(LINK) -lm -o $(NAME_CL)
    @echo "\033[1;4;32m[\xE2\x9C\x94] $(NAME_CL) Created.\033[0m\n"

$(NAME_SV): $(OBJ_SV) $(OBJ_HL) $(OBJ_CM)
    @echo "\033[32mCompiling $(NAME_SV)...\033[0m"
    @gcc $(OBJ_SV) $(OBJ_HL) $(OBJ_CM) $(LINK) -DMODELDIR=\"$(MODELDIR)\" $(SPHX_LIBS) -lm -o $(NAME_SV)
    @echo "\033[1;4;32m[\xE2\x9C\x94] $(NAME_SV) Created.\033[0m\n"

clean:
    @echo "\033[31mRemoving source objects...\033[0m"
    @rm -rf $(OBJ_DIR)
    @echo "\033[4;31m[\xE2\x9D\x8C ] Source objects removed!\033[0m\n"
    @echo "\033[31mRemoving libft objects...\033[0m"
    @make -C $(LIBFT_DIR) clean
    @echo "\033[4;31m[\xE2\x9D\x8C ] libft Objects removed!\033[0m\n"
    @echo "\033[1;4;91m-----All objects removed!-----\033[0m\n"

clean_client:
    @echo "\033[31mRemoving client objects...\033[0m"
    @rm -rf $(OBJ_CL_DIR)
    @rm -rf $(OBJ_HL_DIR)
    @make -C $(LIBFT_DIR) clean
    @echo "\033[4;31m[\xE2\x9D\x8C ] Client objects removed!\033[0m"

clean_server:
    @echo "\033[31mRemoving server objects...\033[0m"
    @rm -rf $(OBJ_SV_DIR)
    @rm -rf $(OBJ_HL_DIR)
    @make -C $(LIBFT_DIR) clean
    @echo "\033[4;31m[\xE2\x9D\x8C ] Server objects removed!\033[0m"

fclean: clean
    @echo "\033[31mRemoving $(NAME_CL)...\033[0m"
    @rm -f $(NAME_CL)
    @echo "\033[4;31m[\xE2\x9D\x8C ] $(NAME_CL) removed!\033[0m\n"
    @echo "\033[31mRemoving $(NAME_SV)...\033[0m"
    @rm -f $(NAME_SV)
    @echo "\033[4;31m[\xE2\x9D\x8C ] $(NAME_SV) removed!\033[0m\n"
    @echo "\033[31mRemoving libft objects and libft.a...\033[0m"
    @make -C $(LIBFT_DIR) fclean
    @echo "\033[4;31m[\xE2\x9D\x8C ] libft objects and libft.a removed!!\033[0m\n"
    @echo "\033[1;4;31m-----All objects, executables and lib files removed!-----\033[0m\n"

re: fclean all

.PHONY: clean clean_client clean_server fclean all re
NAME\u CL=client
NAME_SV=服务器
CFLAGS=-墙-WEROR-Wextra-g
MODELDIR=$(shell pkg config--variable=MODELDIR-pocketsphinx)
SPHX_FLAGS=$(shell包配置--cflags pocketsphinx sphinxbase)
SPHX_LIBS=$(shell包配置--LIBS pocketsphinx sphinxbase)
#SV-特定于服务器的文件
#CL-特定于客户端的文件
#HL-包含客户端和服务器中使用的助手函数的文件
#CM-包含要由服务器执行的命令的文件
SRC_SV=server.c
SRC_CL=client.c
SRC_HL=网络助手.c
SRC_CM=example.c
OBJ_CL_FILES=$(SRC_CL:.c=.o)
OBJ_SV_FILES=$(SRC_SV:.c=.o)
OBJ_HL_FILES=$(SRC_HL:.c=.o)
OBJ_CM_FILES=$(SRC_CM:.c=.o)
HL_目录=./src/助手/
CL_目录=/src/客户/
SV_DIR=./src/server/
CM_目录=./src/server/cmds/
OBJ_DIR=/OBJ/
OBJ_CL_DIR=。/OBJ/客户/
OBJ_CM_目录=。/OBJ/服务器/
OBJ_SV_DIR=。/OBJ/服务器/
OBJ_HL_DIR=。/OBJ/助手/
公司目录=/包括/
LIBFT_DIR=./LIBFT/
SPHX_DIR=./cmusphinx/
OBJ_CL=$(添加前缀$(OBJ_CL_目录),$(OBJ_CL_文件))
OBJ_SV=$(addprefix$(OBJ_SV_DIR),$(OBJ_SV_文件))
OBJ_HL=$(addprefix$(OBJ_HL_DIR),$(OBJ_HL_文件))
OBJ_CM=$(addprefix$(OBJ_SV_DIR),$(OBJ_CM_文件))
LIBFT=$(addprefix$(LIBFT_DIR),LIBFT.a)
LINK=-L$(LIBFT\u DIR)-lft$(SPHX\u LIBS)
全部:obj$(LIBFT)$(NAME_CL)$(NAME_SV)
obj:
@mkdir-p$(OBJ_CL_DIR)
@mkdir-p$(OBJ\U SV\U DIR)
@mkdir-p$(OBJ_HL_DIR)
$(对象目录)%.o:$(目录)%.c
@gcc-I$(LIBFT_DIR)-I$(INC_DIR)$(SPHX_标志)-o$@-c$<
$(目标方向)%.o:$(目标方向)%.c
@gcc-I$(LIBFT_DIR)-I$(INC_DIR)$(SPHX_标志)-o$@-c$<
$(对象目录)%.o:$(对象目录)%.c
@gcc-I$(LIBFT_DIR)-I$(INC_DIR)$(SPHX_标志)-o$@-c$<
$(目标目录)%.o:$(目标目录)%.c
@gcc-I$(LIBFT_DIR)-I$(INC_DIR)$(SPHX_标志)-o$@-c$<
美元(LIBFT):
@echo“\033[32M编译库…\033[0m”
@make-C$(LIBFT_DIR)
@echo“\033[1;4;32m[\xE2\x9C\x94]libft已创建。\033[0m\n”
$(姓名):$(姓名)$(姓名)$(姓名)
@echo“\033[32M编译$(名称)…\033[0m”
@gcc$(OBJ_HL)$(OBJ_CL)$(链接)-lm-o$(名称_CL)
@echo“\033[1;4;32m[\xE2\x9C\x94]$(名称\u CL)已创建。\033[0m\n”
$(名称)$(对象)$(对象)$(对象)$(对象)$(对象)
@echo“\033[32M编译$(名称)…\033[0m”
@gcc$(OBJ_SV)$(OBJ_HL)$(OBJ_CM)$(链接)-DMODELDIR=\“$(MODELDIR)\“$(SPHX_LIBS)-lm-o$(名称_SV)
@echo“\033[1;4;32m[\xE2\x9C\x94]$(名称\u SV)已创建。\033[0m\n”
清洁:
@echo“\033[31M删除源对象…\033[0m”
@rm-rf$(OBJ_DIR)
@echo“\033[4;31m[\xE2\x9D\x8C]源对象已删除!\033[0m\n”
@echo“\033[31M删除libft对象…\033[0m”
@使-C$(LIBFT_DIR)干净
@echo“\033[4;31m[\xE2\x9D\x8C]libft对象已删除!\033[0m\n”
@回显“\033[1;4;91m-----所有对象已移除!-\033[0m\n”
清洁客户:
@echo“\033[31M删除客户端对象…\033[0m”
@rm-rf$(OBJ\U CL\U DIR)
@rm-rf$(OBJ\U HL\U DIR)
@使-C$(LIBFT_DIR)干净
@echo“\033[4;31m[\xE2\x9D\x8C]已删除客户端对象!\033[0m”
清理服务器:
@echo“\033[31M删除服务器对象…\033[0m”
@rm-rf$(OBJ\U SV\U DIR)
@rm-rf$(OBJ\U HL\U DIR)
@使-C$(LIBFT_DIR)干净
@echo“\033[4;31m[\xE2\x9D\x8C]服务器对象已删除!\033[0m”
清洁:清洁
@echo“\033[31mRemoving$(NAME_CL).\033[0m”
@rm-f$(名称)
@echo“\033[4;31m[\xE2\x9D\x8C]$(名称)已删除!\033[0m\n”
@echo“\033[31mRemoving$(NAME_SV).\033[0m”
@rm-f$(名称)
@echo“\033[4;31m[\xE2\x9D\x8C]$(名称\u SV)已删除!\033[0m\n”
@echo“\033[31M删除libft对象和libft.a..\033[0m”
@make-C$(LIBFT_DIR)fclean
@echo“\033[4;31m[\xE2\x9D\x8C]libft对象和libft.a已删除!!\033[0m\n”
@echo“\033[1;4;31m-----已删除所有对象、可执行文件和库文件!-\033[0m\n”
回复:fclean all
.PHONY:clean clean_客户端clean_服务器fclean all re

经过几个小时的实验,我终于找到了正确的方法来编译我的程序。非常感谢尼古拉,因为如果没有他的帮助,我将无法解决这个问题。我想我会在这里发布我的解决方案,以防其他人最终遇到同样的问题,因为我发现很难在上面找到任何资源如何使用Makefile进行编译——文档告诉您如何使用终端进行编译,但正如Nikolay所说,当您使用Makefile时,您必须以不同的方式进行编译

这就是我如何分割编译参数的方法

MODELDIR = $(shell pkg-config --variable=modeldir pocketsphinx)
SPHX_FLAGS = $(shell pkg-config --cflags pocketsphinx sphinxbase)
SPHX_LIBS = $(shell pkg-config --libs pocketsphinx sphinxbase)

# Variable for linking
LINK = -L $(LIBFT_DIR) -lft $(SPHX_LIBS)
我就是这样编译的:

#Compiling source to objects here
$(OBJ_CL_DIR)%.o:$(CL_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) -DMODELDIR=\"$(MODELDIR)\" $(SPHX_FLAGS) -o $@ -c $<

$(OBJ_SV_DIR)%.o:$(SV_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) -DMODELDIR=\"$(MODELDIR)\" $(SPHX_FLAGS) -o $@ -c $<

$(OBJ_HL_DIR)%.o:$(HL_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) -DMODELDIR=\"$(MODELDIR)\" $(SPHX_FLAGS) -o $@ -c $<

$(OBJ_CM_DIR)%.o:$(CM_DIR)%.c
    @gcc -I $(LIBFT_DIR) -I $(INC_DIR) -DMODELDIR=\"$(MODELDIR)\" $(SPHX_FLAGS) -o $@ -c $<

# Compiling objects to executable here   
$(NAME_SV): $(OBJ_SV) $(OBJ_HL) $(OBJ_CM)
    @echo "\033[32mCompiling $(NAME_SV)...\033[0m"
    @gcc $(OBJ_SV) $(OBJ_HL) $(OBJ_CM) $(LINK) $(SPHX_LIBS) -lm -o $(NAME_SV)
    @echo "\033[1;4;32m[\xE2\x9C\x94] $(NAME_SV) Created.\033[0m\n"
#在此处将源代码编译为对象
$(对象目录)%.o:$(目录)%.c
@gcc-I$(LIBFT\u DIR)-I$(INC\u DIR)-DMODELDIR=\“$(MODELDIR)\”$(SPHX\u标志)-o$@-c$<
$(目标方向)%.o:$(目标方向)%.c
@gcc-I$(LIBFT\u DIR)-I$(INC\u DIR)-DMODELDIR=\“$(MODELDIR)\”$(SPHX\u标志)-o$@-c$<
$(OBJ_HL_DIR)%