Так что я бился головой об этой ошибке компилятора в течение последних 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;
}
Оказывается файл abr-helper.cc
не компилируется. Вы можете легко проверить это, добавив
#error "Test"
строка в этот файл. Если сборка завершается успешно, файл не компилируется, и вам нужно добавить его. Как вы это сделаете, зависит от вашего компилятора или IDE.
Вам нужно включить abr-helper.cc в вашу компиляцию, иначе реализация не будет связана с.
Я не знаю, ваф, поэтому я не смогу дать решение. Но вот что происходит:
Во время компиляции все работает отлично. Проблема возникает во время связывания (ошибка ld).
В строке, начинающейся с: 19:04:19 runner, нет ссылки на abr-helper.o или что-то в этом роде. Вы, должно быть, забыли добавить abr-helper.cc где-нибудь в вашей конфигурации waf.
В дополнение к другим ответам (я также не вижу файл abr-tool.cc
быть скомпилированным), функция void testFunc
должен быть объявлен extern
,