40

我无法弄清楚为什么这不起作用。我将把我的所有三个文件都放好,可能有人可以告诉我为什么它会抛出这个错误。我正在使用 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
4

6 回答 6

28

的声明和定义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,字符写入[]);

C++允许函数重载,你可以有多个同名的函数/方法,只要它们有不同的参数。参数类型是函数签名的一部分。

在这种情况下,insertLike作为const char*它的第四个参数和作为insertLikechar *的第四个参数是不同的函数

于 2010-11-09T04:13:09.270 回答
25

尽管以前的海报涵盖了您的特定错误,但如果您不告诉编译器使用 C 链接,则在尝试使用 g++ 编译 C 代码时可能会出现“未定义的引用”链接器错误。

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

extern "C" {

...

void myfunc(int param);

...

}

使“myfunc”在 C++ 程序中可用。

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

#ifdef __cplusplus
extern "C" {
#endif

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

于 2013-02-28T16:46:42.557 回答
23

您需要将所有源文件编译并链接在一起:

g++ main.c function_file.c
于 2010-11-09T04:12:46.483 回答
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})

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

于 2015-07-04T22:04:22.560 回答
3

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

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

在这种情况下,如果 MyLib1 依赖于 MyLib2 就可以了。但是,如果 reverse 为真,您将获得未定义的引用。

于 2020-01-27T08:41:24.987 回答
0

正如保罗所说,这可能是链接器投诉,而不是编译器错误。如果您仔细阅读构建输出/日志(可能需要在单独的 IDE 窗口中查看完整的详细信息),您可以确定问题是来自编译器(需要在代码中修复)还是来自链接器(并且需要在 make/cmake/project 级别修复以包含缺少的库)。

于 2020-03-29T22:12:35.937 回答