这肯定已经回答了一百万次,但我找不到合适的解决方案。
我在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文件相当大,包含我在程序中使用过的几个类。我上面描述的是我将这个自由函数添加到其他工作应用程序时所遵循的确切步骤。
你能帮帮我吗?
答案 0 :(得分:1)
因为您的链接错误大约是enalu::printTargetGasName
,我怀疑您在enalu
命名空间内的标头中声明了该函数,但相应的C ++没有命名空间封装。这可能会使您在sensor.cpp
文件中找到答案。
namespace enalu
{
std::string printTargetGasName(enalu::CombThreshold::TargetGas){}
};