有关交叉编译c中内置函数的警告

时间:2017-02-13 10:30:40

标签: c arm cross-compiling

代码:

#include <string.h>
//Return copy of str string from index position and len length
char *StrCpy2(char *str, unsigned short index, unsigned char len)
{
    char *text;
    text = (char *)malloc(sizeof(char)*(len+1));
    if (text == NULL) return text;
    strncpy(text, str + index, len);
    text[len] = '\0';
    return text;
}

关于此文件和行的控制台输出:

Compiling file: String.c
arm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -ffast-math -O0 -ffunction-sections -fdata-sections -Wall -Wstrict-prototypes -Wextra -std=gnu99 -g -ggdb3 -fverbose-asm -Wa,-ahlms=out/String.lst  -DSTM32F40_41xxx  -DUSE_STM324x7I_EVAL  -MD -MP -MF out/String.d -I.  -IBACnet/inc  -IBACnet/inc/objects  -Iinc  -Ilib/drivers/inc  -Ilib/eval  -IUI/inc  -IuIP/inc String.c -o out/String.o
String.c: In function 'StrCpy2':
String.c:39:2: warning: implicit declaration of function 'strncpy' [-Wimplicit-function-declaration]
  strncpy(text, str + index, len);
  ^
String.c:39:2: warning: incompatible implicit declaration of built-in function 'strncpy'
String.c:39:2: note: include '<string.h>' or provide a declaration of 'strncpy'

我感到很遗憾,因为在从stm32f1移植到stm32f4期间出现了问题,并且将源代码工具链转换为出血边缘工具链(this one)。如你所见,我已经包含了。也许有些#defines不正确?也许eclipse或系统中的某些路径是错误的?

1 个答案:

答案 0 :(得分:1)

我几乎可以肯定,您的项目中有一个名为String.h的文件。因为您在Windows上进行了编译,因为它不够智能,无法发现String.h和工具链string.h之间存在差异,所以行#include <string.h>实际上包含了您的String.h ,你很可能没有这个声明。

如果您在Linux上编译它,它很可能会起作用,因为文件名的情况很重要。对于Windows,除了命名文件(尤其是标题)之外没有其他解决方案。我个人建议每个模块(标题+源)有一个全局函数,然后你可以在函数后命名模块。因此,在上述情况下,您有StrCpy2.hStrCpy2.c