2016-12-07 2 views
0

на это, должно быть, ответили миллион раз, но я не могу найти подходящее решение.g ++ undefined ссылка на функцию постоянного стояния

Я определил свободную функцию в 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 - это всего лишь на mespace).

я получаю undefined reference связывая ошибку

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

инструкции соединительной в файле макияж кажется правильным, то есть 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, или повторно включив sensor.hpp непосредственно в файле core_enose.cpp. Ничто не помогает, и в этот момент я разочарован простым ответом, который ускользает от меня.

Обратите внимание, что я не предоставляю код, потому что файлы sensor.pp довольно большие, содержащие несколько классов, которые я также использовал в своей программе. То, что я описываю выше, - это точные шаги, которые я выполнил, чтобы добавить эту бесплатную функцию к другому рабочему приложению.

Не могли бы вы мне помочь?

+0

Это именно то, как вы заявили о своей функции в sensor.hpp? Я удивлен, что он даже компилирует –

+0

@YanZhou no, я просто опустил внутренности реализации между '{...}'. (также забыл добавить возврат функции, исправлен) – nass

+0

Вопрос Яна Чжоу о декларации в файле .hpp, а не о реализации. –

ответ

1

Поскольку ваша ошибка связи составляет около enalu::printTargetGasName, я подозреваю, что вы объявили функцию в своем заголовке в пространстве имен enalu, но соответствующий C++ не имеет оболочки пространства имен. Это может исправить вас в файле sensor.cpp.

namespace enalu 
{ 
    std::string printTargetGasName(enalu::CombThreshold::TargetGas){} 
}; 
Смежные вопросы