C编译错误:未声明(首次在此函数中使用)

时间:2014-06-29 17:37:13

标签: c makefile raspberry-pi

在PI上,我需要使用这个git:https://github.com/silentbobbert/pi_sensors的i2c.so库。当从这个git运行makefile来获取i2c.so时,我收到了这个错误:

enter image description here enter image description here

以下是.c和.h文件: https://github.com/silentbobbert/pi_sensors/tree/master/Info/LinuxInterface

供参考,这是makefile的内容:

SHELL = /bin/sh
CC    = gcc
FLAGS        = -c -Wall -Werror -fpic
DEBUGFLAGS   = -O0 -D _DEBUG
RELEASEFLAGS = -O2 -D NDEBUG

TARGET  = i2c.so
SOURCES = $(shell echo *.c)
HEADERS = $(shell echo *.h)
OBJECTS = $(SOURCES:.c=.o)

PREFIX = $(DESTDIR)/usr/local
BINDIR = $(PREFIX)/bin

all:
    $(CC) $(FLAGS) $(RELEASEFLAGS) $(SOURCES)
    $(CC) -shared -o $(TARGET) $(OBJECTS)

1 个答案:

答案 0 :(得分:1)

正如其他人所说,这是C代码而不是C#。

无论如何,你有两个错误(并且它们没有直接关联)到makefile,而是你的编译环境和代码本身。

好的,那么如何处理这样的事情。首先注意屏幕截图中的第一行,即正在执行的生成错误消息的命令,我将在此为您重现;

gcc -c -Wall -Werror -fpic -O2-D NDEBUG i2c_get.c i2c_set.c i2cbusses.c i2cset.c util.c

使用此命令,我们将一堆源文件编译(注意-c标志)到单个目标文件中,“c”标志的存在意味着此处不执行链接。这是相关的,因此我们知道工具链的位置,以及我们可以预期的错误类型(通常是语法错误或缺少头文件)。

第一个错误;

i2cset.c: In function 'check_funcs'
i2cset.c:56:2 error: implicit declaration of function 'iotcl' [-Werror=implicit-function-declaration]

有点说,“嘿,我可以看到ioctl是一个函数,但是你没有告诉我任何关于它的事情所以我将假设它的签名是int ioctl() - 具有不确定(但是固定的,非可变参数)参数列表的函数,该列表返回int“。鉴于您正在基于Linux的系统上进行编译,将#include <sys/ioctl.h>添加到文件顶部应该可以解决此错误。

第二个错误;

i2cset.c:63:7: error: 'I2C_SMBUS_BYTE' undeclared (first use in this function)

与第一个错误有关;它有点说'嘿,你还没有告诉我任何有关I2C_SMBUS_BYTE'的信息。同样,查看此错误的最常见原因是缺少头文件。查看您提供链接的源文件,似乎I2C_SMBUS_BYTE已定义 标题文件i2c-dev.h,但似乎包含在i2cset.c中:#include <linux/i2c-dev.h>

此时我确保您的编译器(gcc)可以找到头文件。从你得到的错误消息,我猜它不是,但你应该看到编译器关于无法找到该文件的错误消息。此外,如果文件在您的系统上,请检查是否具有与git站点相比的适当内容。

最后,你看到应该的剩余错误应该以及它们基本上都是一样的。