C++未定义对已定义函数的引用

Mas*_*hew 27 c++ g++ undefined-reference

我无法弄清楚为什么这不起作用.我会把我的所有三个文件都拿出来,也许有人可以告诉我它为什么会抛出这个错误.我正在使用g ++来编译程序.

程序:

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

using namespace std;

int main()
{
  char sentence[MAX_SENTENCE_LENGTH];
  char writeTo[] = "output.txt";
  int distanceTo,likePosition, length, numWords;
  cout << "ENTER A SENTENCE!   ";
  cin.getline(sentence, 299);
  length = strlen(sentence);
  numWords = wordCount(sentence, length);
  for(int x = 0; x < 3; ++x)
  {
    likePosition = likePos(numWords);
    distanceTo = lengthTo(sentence, likePosition, length);
    insertLike(sentence, distanceTo, length, writeTo);
  }
  return 0;  
}
Run Code Online (Sandbox Code Playgroud)

功能文件:

void insertLike(const char sentence[],  const int lengthTo, const int length, char writeTo[])
{
  char part1[MAX_SENTENCE_LENGTH], part2[MAX_SENTENCE_LENGTH];
  char like[] = " like ";
  for(int y = 0; y < lengthTo; ++y)
    part1[y] = sentence[y];
  for(int z = lengthTo+1; z < length - lengthTo; ++z)
    part2[z] = sentence[z];
  strcat(part1, like);
  strcat(part1, part2);
  writeToFile(sentence, writeTo);
  return;
}
Run Code Online (Sandbox Code Playgroud)

头文件:

void insertLike(const char sentence[], const int lengthTo, const int length, const char writeTo[]);
Run Code Online (Sandbox Code Playgroud)

错误的确切原因是:

undefined reference to 'insertLike(char const*, int, int, char const*)'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

Mud*_*Mud 22

声明和定义insertLike是不同的

在您的头文件中:

void insertLike(const char sentence[], const int lengthTo, const int length, const char writeTo []);

在你的'功能文件'中:

void insertLike(const char sentence[], const int lengthTo, const int length,char writeTo []);

C++允许函数重载,只要它们具有不同的参数,您可以在其中具有多个具有相同名称的函数/方法.参数类型是函数签名的一部分.

在这种情况下,insertLikeconst char*作为其第四参数并且insertLikechar *作为其第四参数是不同的功能.

  • 男人,有时只需要额外的一组眼球.:)我记得当我学习C的时候,我花了半天的时间沮丧地敲击键盘,然后我的岳父会回到家,指着我的肩膀,"你错过了一个分号那里." >> (25认同)
  • 好吧,从来没有岳父.可能是为什么我花了半天多的时间在沮丧地敲打键盘:-) (7认同)
  • @ulidtko机器* did *捕获错误。问题是OP不理解机器在告诉他什么。我想编译器可能会认识到声明的函数与定义的函数之间的相似性,并提出有益的建议(“您的意思是……吗?”) (3认同)
  • 有什么办法让机器帮我捕获这个错误吗? (2认同)

Mat*_*ttK 20

虽然之前的海报涵盖了您的特定错误,但是如果您不告诉编译器使用C链接,那么在尝试使用g ++编译C代码时,您可能会收到"未定义的引用"链接器错误.

例如,您应该在C头文件中执行此操作:

extern "C" {

...

void myfunc(int param);

...

}
Run Code Online (Sandbox Code Playgroud)

使'myfunc'在C++程序中可用.

如果您还想在C中使用它,请将extern "C" {and 包装}#ifdef __cplusplus预处理器条件中,例如

#ifdef __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)

这样,extern当使用C编译器时,块将被"跳过".


cas*_*nca 15

您需要编译并链接所有源文件:

g++ main.c function_file.c
Run Code Online (Sandbox Code Playgroud)

  • 我意识到这已经快五年了,但我是一个C++新手,这对我有用.谢谢. (2认同)

Axe*_*ect 5

如果您使用 CMake,这也可能发生。如果您创建了一个新类并且想要实例化它,那么在构造函数调用时您将收到此错误 - 即使标题和cpp文件是正确的 - 如果您没有进行CMakeLists.txt相应的修改。

使用 CMake,每次创建新类时,在使用它之前,必须将头cpp文件、文件和任何其他可编译文件(如 Qtui文件)添加到存储位置CMakeLists.txt,然后重新运行。cmake .CMakeLists.txt

例如,在这个CMakeLists.txt文件中:

cmake_minimum_required(VERSION 2.8.11)

project(yourProject)

file(GLOB ImageFeatureDetector_SRC *.h *.cpp)

### Add your new files here ###
add_executable(yourProject YourNewClass.h YourNewClass.cpp otherNewFile.ui})

target_link_libraries(imagefeaturedetector ${SomeLibs})
Run Code Online (Sandbox Code Playgroud)

如果您正在使用该命令,file(GLOB yourProject_SRC *.h *.cpp)那么您只需要重新运行cmake .而无需修改CMakeLists.txt.