g++ 未定义对独立函数的引用

g++ undefined reference to a free standing function

这一定已经回答了一百万次了,但我找不到合适的解决方案。

我在sensor.cpp中定义了一个自由函数:

std::string printTargetGasName(enalu::CombThreshold::TargetGas){}

那么我已经声明了函数的原型

sensor.hpp

std::string printTargetGasName(enalu::CombThreshold::TargetGas);

然后我在core_enose.hpp中包含sensor.hpp并尝试使用core_enose.cpp中的函数(enalu只是一个命名空间)。

我收到 undefined reference 链接错误

core_enose.cpp:284: undefined reference to `enalu::printTargetGasName(enalu::CombThreshold::TargetGas)'

make 文件中的链接说明似乎是正确的,即 sensor.opp 在 core_enose.opp 之后:

g++ -g -Wall -Wextra -pedantic -std=c++11 [...] obj_dbg/core_enose.opp [...] obj_dbg/sensor.opp [...]

我还检查了符号是否正确存在于 sensor.opp 文件中:

$> nm obj_dbg/sensor.opp  | grep printTarget
$> 000000000000cc9c T _Z18printTargetGasNameN5enalu13CombThreshold9TargetGasE

我也试过绝望的深夜措施,比如 extern ,或者直接在 core_enose.cpp 文件中重新包含 sensor.hpp 。没有任何帮助,在这一点上,我对我无法回答的简单答案感到沮丧。

请注意,我没有提供代码,因为 sensor.?pp 文件相当大,其中包含一些 类 我也在我的程序中使用过的文件。我上面描述的是我将此免费功能添加到其他工作应用程序所遵循的确切步骤。

你能帮帮我吗?

因为你的 link 错误是关于 enalu::printTargetGasName,我怀疑你在 enalu 命名空间内的头文件中声明了函数,但相应的 C++ 没有命名空间外壳。这可能会在 sensor.cpp 文件中修复您。

namespace enalu
{
    std::string printTargetGasName(enalu::CombThreshold::TargetGas){}
};