1

因此,在过去的 2 个小时里,我一直在努力解决这个编译器错误,并认为我会在这里发布代码,看看是否有人能解释我的错误。

我已经去掉了所有不相关的部分,留下了一个最小的程序(如下所示),据我所知,它应该可以编译和运行。如果我来了,但我看不到 main 中对 testFunc 的调用有什么问题,那么一切都会编译并运行良好。但是,通过调用 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-tools.cc 中 abr-helper.h 中定义的宏,当我将 abr-tools.cc 放在与 abr-helper.h 相同的文件夹中并仅使用 '#include "abr-helper 时,问题仍然存在。H”'。

  • 最初的错误是一样的,但是对于 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;

}
4

4 回答 4

5

看来该文件abr-helper.cc没有被编译。您可以通过添加

#error "Test"

该文件的行。如果构建成功,则该文件没有被编译,您需要添加它。如何做到这一点取决于您的编译器或 IDE。

于 2012-12-24T20:52:50.817 回答
1

您需要在编译中包含 abr-helper.cc,否则不会链接到实现。

于 2012-12-24T20:53:18.137 回答
1

我不知道waf,所以我无法给出解决方案。但这是发生的事情:

在编译期间,一切正常。链接期间出现问题(ld 错误)。

在以 : 19:04:19 runner 开头的行上,没有引用 abr-helper.o 或类似的东西。您一定忘记在 waf 配置中的某处添加 abr-helper.cc。

于 2012-12-24T20:55:19.550 回答
0

除了其他答案(我也没有看到abr-tool.cc要编译的文件)之外,还void testFunc需要声明该函数extern

于 2012-12-24T21:31:39.920 回答