我有通过Makefile编译我的程序的问题。 Ofcorse我读了许多类似问题的主题,但我无法理解我的情况下的依赖,因此我有编译问题。
这是我的节目,他被写在c上。很简单。这不是全部内容,但我想这足以理解Makefile中的问题。程序只有3个文件:
main.c
#include "struct.h"
#define SIZE_STRUCT 2
int main()
{
int i = 0;
while(i < 2)
{
printf("Contens %d /n" , CommandStructure[i].size)
i = i +1;
}
return 0;
}
struct.h
#ifndef STRUCT
#define STRUCT
struct Command
{ char tableCmd[5];
char *NameCommand;
int size;
};
#endif
和 struct.c
#include "struct.h"
static struct Command CommandStructure[]={
{
.tableCmd = {0x3,0x5,0x4,0x4,0x5},
.NameCommand = "SOMEWHERE",
.size = 11,
},{
.tableCmd = {0x6, 0x34, 0x40, 0x22, 0x4},
.NameCommand = "SOMETHING",
.size = 12,
}
};
我的主要问题Makefile
NAME=test
all: main.c struct.c struct.h
gcc struct.c main.c -o $(HOME)/Pulpit/$(NAME)
Ofcorse我得到错误
错误:'CommandStructure'未声明(首次使用此功能) if(!strncmp(buf,CommandStructure [i] .NameCommand,CommandStructure [i] .size))main.c:140:27: 注意:每个未声明的标识符仅报告一次 功能它出现在Makefile:6:polecenia dla obiektu'all'nie powiodóysięmake:*** [all] Error1
答案 0 :(得分:3)
struct.c
中的main.c
声明不可见CommandStructure
。您需要在struct.h
中声明#ifndef STRUCT
#define STRUCT
struct Command
{ char tableCmd[5];
char *NameCommand;
int size;
};
extern struct Command CommandStructure[];
#endif
,如此:
static
此外,struct.c
中CommandStructure
的使用恰恰相反 - 它确保符号static
仅在该翻译单元中可用。因此,您还应该从struct.c
删除create or replace function point_to_M1(x float, y float,z integer)
returns float AS
$$
DECLARE
geom geometry;
begin
select testo.geom from testo where lineid=z;
return st_astext(ST_line_interpolate_point(st_geometryN(geom,1),st_line_locate_point(st_geometryN(geom,1),'point(x y)')));
end;
$$
language plpgsql;
限定符。
答案 1 :(得分:2)
您需要从所有翻译单元中看到CommandStructure
变量。为此,在头文件中将结构声明为extern
。
此外,您必须从static
文件中的CommandStructure
删除struct.c
存储类说明符。
答案 2 :(得分:1)
以下是建议的makefile内容:
CC := /bin/gcc
RM := /bin/rm
CFLAGS := -Wall -Wextra -pedantic -c -ggdb
LFLAGS :=
NAME := test
OBJS := main.o struct.o
.PHONY: all clean
all: $(NAME) $(OBJS)
%.o: %.c struct.h
<tab>$(CC) $(CFLAGS) $< -o $@ -I.
$(NAME): $(OBJS)
<tab>$(CC) $(LFLAGS) -o $@ $(OBJS)
clean:
<tab>$(RM) -f *.o
<tab>$(RM) -f %(NAME)
Note: use a tab char where I have used <tab>
关于struct.c文件
使用'static'使CommandStructure []仅在该文件中可见。
建议删除'static'修饰符
关于struct.h文件
插入以下行,以便main.c可以访问struct
extern struct Command CommandStruct[]
关于main.c文件
为printf()
的正确原型插入以下行#include <stdio.h>
建议学习'for'语句,因为这比'while'和'i = i + 1;'更好。语句
缩进代码时,始终使用空格,而不是制表符。 因为每个编辑器/文字处理器都会为个人偏好设置制表位/标签宽度
为了便于阅读,建议在每个左括号'{'后缩进4个空格 并且在每个结束括号'}'之前取消缩进
答案 3 :(得分:0)
呀。就是这个。必须添加一个细节 [] 或
#ifndef STRUCT
#define STRUCT
struct Command
{ char tableCmd[5];
char *NameCommand;
int size;
};
extern struct Command CommandStructure[]; // CommandStructure is table so should be []
#endif
我还将Makefile更改为此
NAME=test
all:
gcc struct.c main.c -o $(HOME)/Pulpit/$(NAME)
编译evrythings没有任何错误。所以,这不是Makefile的问题,而是语法c文件。
谢谢