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

时间:2016-12-07 21:15:51

标签: c++ undefined-reference

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

我在sensor.cpp中定义了一个免费功能:

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

然后我宣布了函数的原型

sensor.hpp

中的

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

然后我在sensor.hpp中加入core_enose.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文件相当大,包含我在程序中使用过的几个类。我上面描述的是我将这个自由函数添加到其他工作应用程序时所遵循的确切步骤。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

因为您的链接错误大约是enalu::printTargetGasName,我怀疑您在enalu命名空间内的标头中声明了该函数,但相应的C ++没有命名空间封装。这可能会使您在sensor.cpp文件中找到答案。

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