链接 [重复] 时 gcc 找不到对函数 DoIt() 的引用

Posted

技术标签:

【中文标题】链接 [重复] 时 gcc 找不到对函数 DoIt() 的引用【英文标题】:gcc can't find reference to function DoIt() when linking [duplicate] 【发布时间】:2018-12-04 23:28:29 【问题描述】:

我现在快疯了。似乎 gcc 存在问题,它无法打开包含文件在链接时找不到函数 DoIt()。我尝试在代码块中编译这段代码,但它不起作用,所以我在控制台中用 G++ 尝试它,它仍然不起作用。所以我认为这是gcc的问题。

这是我的代码

main.cpp

#include <iostream>
#include "source.h"
int main()

    std::cout<<"That works"<<std::endl;
    DoIt();
    while(true)
    
    
    return 0;

source.cpp

#include "source.h"
#include <iostream>

void DoIt()

std::cout<<"That works too"<<std::endl; //Currently doesn't work
     

source.h

void DoIt();

这是我在终端里写的

g++ main.cpp -std=c++11 -o result

这是我运行时的错误信息

/tmp/ccG6X4Bw.o: In function `main':
main.cpp:(.text+0x2d): undefined reference to `DoIt()'
collect2: error: ld returned 1 exit status

我不知道为什么它不起作用

【问题讨论】:

这不是包含路径的问题,而是来自链接器的错误,告诉您您从未定义过DoIt。如果您在一次调用中编译和链接,则需要将所有.cpp 文件提供给编译器命令行(g++ 命令行上默认没有-c),以便它具有所有定义。 g++ main.cpp -std=c++11 -o result 看起来不像在 source.cpp 中编译和链接。试一试g++ main.cpp source.cpp -std=c++11 -o result 【参考方案1】:

默认情况下,gcc 会尝试编译和链接。在没有来自source.cpp 的代码的情况下进行链接将导致链接器无法将DoIt 的调用链接到其代码。如果您只想编译,请将-c 传递给gcc

来自手册页:

  When you invoke GCC, it normally does preprocessing, compilation, assembly and linking.
  ...
   -c  Compile or assemble the source files, but do not link.
       The linking stage simply is not done.

【讨论】:

以上是关于链接 [重复] 时 gcc 找不到对函数 DoIt() 的引用的主要内容,如果未能解决你的问题,请参考以下文章

gcc编译文件时找不到指定函数怎么办

GCC 在 lib 中找不到函数

C ++线程找不到函数作为参数(链接器)[重复]

GCC编译出错找不到环境变量

GCC编译出错找不到环境变量

gcc 链接器找不到库(openNI)