waf在链接时间:" undefined reference"错误

时间:2012-12-24 20:49:38

标签: c++ compiler-errors undefined-reference waf

所以我在最近2个小时内一直在讨论这个编译器错误,并且认为我会在这里发布代码,看看是否有人可以解释我的错误。

我已经删除了所有不相关的位以留下一个简单的最小程序(如下所示),据我所知,它应该编译并运行。如果我纪念,但我看不出什么是错误的调用testFunc in 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-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 个答案:

答案 0 :(得分:5)

文件abr-helper.cc似乎无法编译。您可以通过添加

轻松测试
#error "Test"

到该文件的行。如果构建成功,则文件未编译,您需要添加它。如何执行此操作取决于您的编译器或IDE。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

在以19:04:19跑步者开头的行上,没有对abr-helper.o或类似内容的引用。您必须忘记在waf配置中的某处添加abr-helper.cc。

答案 3 :(得分:0)

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