Makefile文件。使用头文件创建程序

时间:2015-07-03 11:11:58

标签: c struct makefile header-files

我有通过Makefile编译我的程序的问题。 Ofcorse我读了许多类似问题的主题,但我无法理解我的情况下的依赖,因此我有编译问题。

这是我的节目,他被写在c上。很简单。这不是全部内容,但我想这足以理解Makefile中的问题。程序只有3个文件:

  • main.c(包括struct.h并使用struct.c中的Object)
  • struct.h
  • struct.c(包括struct.h)

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

4 个答案:

答案 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.cCommandStructure的使用恰恰相反 - 它确保符号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文件。

谢谢