C 在函数“u start';”中:对“main'”的未定义引用;
我正在从事一个有30多个源文件和一些子目录的项目> 我添加了i2c支持,我正在尝试编译它,但出现以下错误:C 在函数“u start';”中:对“main'”的未定义引用;,c,gcc,makefile,ld,C,Gcc,Makefile,Ld,我正在从事一个有30多个源文件和一些子目录的项目> 我添加了i2c支持,我正在尝试编译它,但出现以下错误: === Making Control Interface Type. make[1]: Entering directory '/root/i2c_test/TestBench/interfaces' arm-linux-gnueabihf-gcc -Wall -g -O0 -std=c11 -DWIN32 -DUSE_SPIDEV - D_DEFAULT_SOURCE -c -
=== Making Control Interface Type.
make[1]: Entering directory '/root/i2c_test/TestBench/interfaces'
arm-linux-gnueabihf-gcc -Wall -g -O0 -std=c11 -DWIN32 -DUSE_SPIDEV - D_DEFAULT_SOURCE -c -o i2cdev_lib.o i2cdev_lib.c
arm-linux-gnueabihf-gcc -Wall -g -O0 -std=c11 -DWIN32 -DUSE_SPIDEV - D_DEFAULT_SOURCE -c -o spidev_lib.o spidev_lib.c
+++ Compiling I2C_SPI_LIB i2cdev_lib.o spidev_lib.o
/usr/lib/gcc/arm-linux-gnueabihf/4.9/../../../arm-linux-gnueabihf/crt1.o: In function `_start':
/build/glibc-1yTpB4/glibc-2.19/csu/../ports/sysdeps/arm/start.S:119:
undefined reference to `main'
collect2: error: ld returned 1 exit status
Makefile:56: recipe for target '../Debug/i2c_spidev_lib.o' failed
make[1]: *** [../Debug/i2c_spidev_lib.o] Error 1
make[1]: Leaving directory '/root/i2c_test/TestBench/interfaces'
Makefile:139: recipe for target 'interface' failed
Makefile中的行
#模式规则
$(CIFOUTDIR)/i2c_spidev_lib.o:i2cdev_lib.o spidev_lib.o
@echo“+++编译I2C_SPI_LIB$^”
@$(LD)-o$@$^
$(CIFOUTDIR)/spidev_lib.o:spidev_lib.c#直接编译到restoutdir
@回音“+++编译$你在建图书馆吗?那么你不应该正常链接它。您应该做什么取决于您是创建静态库还是动态库。关于如何创建这两种类型,这里和互联网上都有很多重复。将-ldl-lgcc-lc-lm
链接到一个对象文件是毫无意义和错误的。你需要读更多关于你一定是看错了规则的书。您介绍的规则不会输出观察到的消息“+++编译I2C_SPI_LIB i2cdev_LIB.o spidev_LIB.o”。他们会输出更像“+++编译spidev_lib.c”的东西。即使这样做,我仍然会得到相同的错误$(CIFOUTDIR)/i2c_spidev_lib.o:i2cdev_lib.c spidev_lib.c直接编译到restoutdir@echo”+++编译i2c_SPI_lib$^“@$(CC)$(CFLAGS)-ldl-lgcc-lc-lm-o$@$?请验证您的项目是否至少包含一个函数名为main(){}
的文件。即使函数不包含任何内容也无所谓。但必须有一个名为“main()”的函数。因为startup.S
文件正在抱怨它。在startup.S
中,标签\u start:
下应该有一个代码可以跳转到main
函数,类似于b main
即分支到main。您正在构建库吗?那么你不应该正常链接它。您应该做什么取决于您是创建静态库还是动态库。关于如何创建这两种类型,这里和互联网上都有很多重复。将-ldl-lgcc-lc-lm
链接到一个对象文件是毫无意义和错误的。你需要读更多关于你一定是看错了规则的书。您介绍的规则不会输出观察到的消息“+++编译I2C_SPI_LIB i2cdev_LIB.o spidev_LIB.o”。他们会输出更像“+++编译spidev_lib.c”的东西。即使这样做,我仍然会得到相同的错误$(CIFOUTDIR)/i2c_spidev_lib.o:i2cdev_lib.c spidev_lib.c直接编译到restoutdir@echo”+++编译i2c_SPI_lib$^“@$(CC)$(CFLAGS)-ldl-lgcc-lc-lm-o$@$?请验证您的项目是否至少包含一个函数名为main(){}
的文件。即使函数不包含任何内容也无所谓。但必须有一个名为“main()”的函数。因为startup.S
文件正在抱怨它。标签\u start:
下的startup.S
中应该有一个代码可以跳转到main
函数,类似于b main
,即分支到main。
$(CIFOUTDIR)/spidev_lib.o : spidev_lib.c # compile directly to restoutdir
@echo "+++ Compiling $<"
@$(CC) $(CFLAGS) -ldl -lgcc -lc -lm -c -o $@ $<
$(CIFOUTDIR)/i2cdev_lib.o : i2cdev_lib.c # compile directly to restoutdir
@echo "+++ Compiling $<"
@$(CC) $(CFLAGS) -ldl -lgcc -lc -lm -c -o $@ $<