waf во время ссылки: & quot; неопределенная ссылка & quot; ошибка

Так что я бился головой об этой ошибке компилятора в течение последних 2 часов и думал, что выложу код здесь, чтобы посмотреть, сможет ли кто-нибудь пролить свет на мою ошибку.

Я убрал все ненужные биты, чтобы оставить минимальную программу (показанную ниже), которая, насколько я вижу, должна компилироваться и запускаться. Если я комментирую, но не вижу, что неправильно в вызове testFunc в main, то все компилируется и работает нормально. Однако при вызове testFunc я получаю следующее:

$ ./waf -v --run abr-tool
Waf: Entering directory `/home/conor/workspace/msc/AdaptiveIPTV/Software/conor/ns3/ns-3.15/build'
[1665/1822] cxxprogram: build/src/abr-tools/examples/abr-tool.cc.4.o -> build/src/abr-tools/ns3.15-abr-tool-debug
19:04:19 runner ['/usr/bin/g++', '-L/usr/lib', '-lboost_iostreams', '-L/usr/lib', '-lboost_iostreams', '-pthread', 'src/abr-tools/examples/abr-tool.cc.4.o', '-o', '/home/conor/workspace/msc/AdaptiveIPTV/Software/conor/ns3/ns-3.15/build/src/abr-tools/ns3.15-abr-tool-debug', '-Wl,-Bstatic', '-Wl,-Bdynamic', '-Wl,--no-as-needed', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-lns3.15-point-to-point-debug', '-lns3.15-internet-debug', '-lns3.15-mpi-debug', '-lns3.15-bridge-debug', '-lns3.15-network-debug', '-lns3.15-core-debug', '-lrt']
src/abr-tools/examples/abr-tool.cc.4.o: In function `main':
/home/conor/workspace/msc/AdaptiveIPTV/Software/conor/ns3/ns-3.15/build/../src/abr-tools/examples/abr-tool.cc:7: undefined reference to `testFunc()'
collect2: ld returned 1 exit status

Как вы можете видеть, приведенный ниже код создается как часть гораздо более крупного проекта, и я знаю, что ошибка может происходить из-за этого процесса сборки, а не из-за проблемы с моим кодом, но в любом случае я столкнулся с чем-то вроде стены в моем понимании того, что здесь происходит. Я изучаю c ++ по ходу дела и, честно говоря, я не чувствую себя достаточно опытным, чтобы даже просто скомпилировать этот код самостоятельно и быть в состоянии сказать «это должно определенно работать, но это не так», поэтому я представить это так.

Еще пара моментов, которые могут быть актуальны:

  • Я могу использовать макросы, определенные в abr-helper.h из abr-tools.cc, и проблема сохраняется, когда я помещаю abr-tools.cc в ту же папку, что и abr-helper.h, и просто использую «#include» abr-helper .час»‘.

  • исходная ошибка была такой же, но для множества других вещей, определенных в abr-helper.h и используемых в abr-tools.cc

Буду признателен за любую помощь, которую вы можете предложить, спасибо заранее.

ABR-helper.h:

#ifndef ABR_HELPER_H
#define ABR_HELPER_H
#include <iostream>

void testFunc();

#endif /* ABR_HELPER_H */

abr-helper.cc:

#include <iostream>
#include "abr-helper.h"
void testFunc(){
std::cout << "this is all testFunc() does ..." << std::endl;
}

abr-tool.cc:

#include <iostream>
#include "ns3/abr-helper.h"
int main (int argc, char *argv[]){

std::cout << "in main()" << std::endl;
testFunc();
return 0;

}

0

Решение

Оказывается файл abr-helper.cc не компилируется. Вы можете легко проверить это, добавив

#error "Test"

строка в этот файл. Если сборка завершается успешно, файл не компилируется, и вам нужно добавить его. Как вы это сделаете, зависит от вашего компилятора или IDE.

4

Другие решения

Вам нужно включить abr-helper.cc в вашу компиляцию, иначе реализация не будет связана с.

1

Я не знаю, ваф, поэтому я не смогу дать решение. Но вот что происходит:

Во время компиляции все работает отлично. Проблема возникает во время связывания (ошибка ld).

В строке, начинающейся с: 19:04:19 runner, нет ссылки на abr-helper.o или что-то в этом роде. Вы, должно быть, забыли добавить abr-helper.cc где-нибудь в вашей конфигурации waf.

1

В дополнение к другим ответам (я также не вижу файл abr-tool.cc быть скомпилированным), функция void testFunc должен быть объявлен extern,

0
По вопросам рекламы [email protected]