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

时间:2010-11-09 04:08:14

标签: 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;  
}

功能文件:

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;
}

标题文件:

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

错误恰恰是:

undefined reference to 'insertLike(char const*, int, int, char const*)'
collect2: ld returned 1 exit status

6 个答案:

答案 0 :(得分: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 ++允许函数重载,只要它们具有不同的参数,您可以在其中具有多个具有相同名称的函数/方法。参数类型是函数签名的一部分。

在这种情况下,将insertLike作为其第四个参数的const char*和将insertLike作为其第四个参数的char *不同的功能

答案 1 :(得分:20)

虽然之前的海报涵盖了您的特定错误,但是在尝试使用g ++编译C代码时,您可以获得“未定义的引用”链接器错误,如果您不告诉编译器使用C链接。

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

extern "C" {

...

void myfunc(int param);

...

}

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

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

#ifdef __cplusplus
extern "C" {
#endif

这样,使用C编译器时,extern块将被“跳过”。

答案 2 :(得分:14)

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

g++ main.c function_file.c

答案 3 :(得分:2)

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

使用CMake,每次创建新类时,在使用标题之前,必须将cpp文件和任何其他可编译文件(如Qt ui文件)添加到{{1}然后重新运行存储CMakeLists.txt的{​​{1}}。

例如,在此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}) 而无需修改file(GLOB yourProject_SRC *.h *.cpp)

答案 4 :(得分:2)

如果要包含一个依赖于另一个库的库,那么包含的顺序也很重要:

g++ -o MyApp MyMain.o -lMyLib1 -lMyLib2

在这种情况下,MyLib1依赖于MyLib2是可以的。 但是,如果存在true,则将获得未定义的引用。

答案 5 :(得分:0)

正如Paul所说,这可能是一个链接程序投诉,而不是编译器错误。如果您仔细阅读了构建输出/日志(可能需要在单独的IDE窗口中查看完整的详细信息),则可以确定问题出在编译器(需要用代码解决)还是链接器(需要将在make / cmake / project级别进行修复,以包含缺少的库)。