makefile错误----> make:***没有规则来制作目标`mysql.h'

时间:2011-06-24 17:56:20

标签: mysql c api makefile

这可能听起来像一个愚蠢的问题。但是这里.....我正在使用一个名为db_access.c的C程序,它与MySQL交互(在Ubuntu 10.10中与MySQL Server版本:5.1.49-1ubuntu8.1(Ubuntu))。在程序内部,我有:include "mysql.h" 当我执行以下操作时,一切正常:

gcc -I/usr/include/mysql db_access.c -lmysqlclient -o db_access
./db_access

当我尝试将其集成到现有(和工作的makefile)时出现问题。 makefile的内容:

all: MappingServer

#Macro definitions
CC = gcc
CFLAGS = -lm
INCLUDES = -I/usr/include/mysql
LIBS = -L/usr/lib/mysql -lmysqlclient 

MappingServer.o: MappingServer.c map_registration.h 
    $(CC) $(CFLAGS) -c MappingServer.c

route_aggregation.o: route_aggregation.c map_registration.h 
    $(CC) $(CFLAGS) -c route_aggregation.c

db_access.o: db_access.c map_registration.h mysql.h
    $(CC) $(CFLAGS) $(INCLUDES) -c db_access.c 

MappingServer: MappingServer.o route_aggregation.o db_access.o
    $(CC) $(LIBS) -o MappingServer MappingServer.o route_aggregation.o db_access.o  

clean:
    -rm MappingServer.o route_aggregation.o db_access.o

我还有另外两个C程序,MappingServer.c和route_aggregation.c。这三个文件需要一起编译。顺便说一句,我也做了:

root@ahuq-kitchen:/home/ahuq/MappingServer# mysql_config --cflags
-I/usr/include/mysql  -DBIG_JOINS=1  -fno-strict-aliasing   -DUNIV_LINUX -DUNIV_LINUX

    root@ahuq-kitchen:/home/ahuq/MappingServer# mysql_config --libs
-Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient

所以我认为路径还可以。当我这样做时:make all 我明白了:

root@ahuq-kitchen:/home/ahuq/MappingServer# make all
gcc -lm -c MappingServer.c
gcc -lm -c route_aggregation.c
route_aggregation.c: In function ‘vtysh_input’:
route_aggregation.c:602: warning: function returns address of local variable
make: *** No rule to make target `mysql.h', needed by `db_access.o'.  Stop.

为什么会这样?

3 个答案:

答案 0 :(得分:6)

db_access.o: db_access.c map_registration.h mysql.h

告诉make db_access.o取决于db_access.cmap_registration.hmysql.h。抱怨,因为在当前目录中找不到mysql.h(它位于/usr/include/mysql)。

请参阅问题Makefile updated library dependency,了解如何在make

中将库指定为依赖项

答案 1 :(得分:3)

您将“mysql.h”作为依赖项,但它不在当前目录中,因此Make认为它需要构建它,但不知道如何。

答案 2 :(得分:0)

尝试删除所有行:

MappingServer.o: MappingServer.c map_registration.h 

如果c文件中包含map_registration.h ,make就足够聪明地找到它。唯一需要注意的是使用-I设置搜索文件路径。