链接 [重复] 时 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() 的引用的主要内容,如果未能解决你的问题,请参考以下文章