如何正确启动C和C ++ IAR嵌入式项目?

时间:2013-12-10 07:36:43

标签: c++ c embedded iar

我目前正致力于stm32f3的嵌入式项目。在这个项目中,我想使用.cpp.c文件: C文件用于UART / I2C ...初始化文件,而C ++用于更面向对象的解决方案。因此,我真的需要保留它们。 我的问题是如何让它正常工作?我在网上看到了一些答案,但这对我来说似乎都很混乱。

我已经在C ++项目中有一个带有uart.c/h文件的项目(主板工作得很好),但是当我向项目中添加i2c.c/h个文件时,出现了很多链接错误。

示例= Error[Li005]: no definition for "I2C_StructInit" [referenced from C:\Users\IAR Embedded Workbench\STM32F3-Discovery_FW_V1.1.0\Project\I2C Interface CPU\Debug\Obj\i2c.o]

main应该是C还是C ++文件?

我应该在项目设置中使用Language\Auto,还是指定要用C或C ++编译的每个文件?

我何时需要使用extern "C"

我正在使用IAR Embedded Workbench IDE。 欢迎任何其他建议。

3 个答案:

答案 0 :(得分:3)

我对这个平台并不熟悉,但问题听起来很普遍。

  

main应该是C还是C ++文件?

C ++将是更安全的选择,因为main与程序初始化有关,而C ++实现了与C不同的动态初始化。

  

我何时需要使用extern "C"

这很重要,可能是您的问题的根源。您需要extern "C"来装饰C ++中使用的每个声明,其定义在C中提供。

如果您的C标头缺少extern "C",您可以在其中为它们添加:

extern "C" {
#include "i2c.h"
}

#include指令置于任何内容中通常是一个非常糟糕的主意,但这是相对无害的,因为extern "C" {}除了修改包含的声明的链接之外不会引入新的嵌套声明范围内。

正如我所说,在C ++模式下编译时,您还可以修改头文件以包含extern "C"。我的建议是基于修改图书馆是更大的罪恶的想法。根据我的经验,可以为平台动态生成嵌入式驱动程序,或者在任何情况下,您可能会稍后移动到稍微不同的平台。您应该在该答案中使用自己标题中的成语,但我个人不会不惜一切代价编辑i2c.h

答案 1 :(得分:3)

在你的.h文件中,你应该这样写:

#ifdef __cplusplus
extern "C" {
#endif

xxxxx // Your header file content

#ifdef __cplusplus
}
#endif

然后你可以在.c和.cpp代码中包含这样的.h文件而没有问题。

注意诀窍是,所有这些函数都没有c ++装饰,所以c和c ++都看到相同的函数名。

答案 2 :(得分:2)

关于IAR特定的东西:

Language\Auto使编译器从文件扩展名.c/.cpp中确定语言。请注意,虽然IAR(至少5.4)仅支持C ++的子集,但并非所有功能都可用。

对于您提出的其他问题:请参阅Potatoswatters关于externmain的答案。