1

我在纯 C - st usb 库中有一个项目,我需要将其迁移到 c++ 并将相同的结构更改为类。我删除了所有 C++“保护”,例如:

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

我将所有文件扩展名从更改.c.cpp(HAL 库除外)。我意识到 c++.hex比 c 小 7kB .hex。当我查看.map文件时,我发现许多功能都丢失了。我认为static功能导致了这种情况,但删除static关键字并没有帮助。有谁知道可能导致某些函数未编译的原因。当扩展是.c一切都很好。

4

2 回答 2

2

我可以想到两个主要原因:

  1. 内联。如果所有用法都可以内联,编译器可以决定不需要将该函数作为独立函数发出。
  2. 未使用的代码。编译器可以看到一个函数没有在代码中的任何地方使用,并决定从最终结果中删除它。

如果将结果用作某种库,即您的环境调用特定函数而不在您自己的代码中进行显式调用,我认为最好的方法是将您的代码编译并链接为库(可能是动态库)并导出这些函数作为库接口(gcc 中的可见性,MSVC 中的 dllexport)将强制编译器/链接器将它们包含在生成的二进制文件中,即使它们现在不明白为什么需要它们。(当然,这是对您的目标环境的疯狂猜测。)

另一种选择是关闭特定的编译器/链接器优化以删除死代码并强制为内联函数发出独立函数实例,但我认为这是非常间接的方法,具有更广泛的效果并且可能会使以后的维护复杂化。

于 2016-08-12T08:28:02.873 回答
1

C++ 函数的签名与 C 函数不同。由于您丢失了功能并且代码要小得多,因此很可能需要 C 链接的函数被编译为 C++,并且签名不匹配正在阻止正确链接。

发生这种情况的一个可能的地方是中断向量表。如果处理函数是使用 C++ 链接编译的,则处理程序地址不会使其成为使用 C 编译的表。

仔细检查中断向量并确保它们引用了正确的函数。如果它们是正确的,请检查使用 C 编译的任何其他可能引用使用 C++ 编译的外部符号的代码。

于 2016-08-12T20:01:13.167 回答