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

gijlo24d  于 2023-06-25  发布在  其他
关注(0)|答案(6)|浏览(172)

我不明白为什么这不起作用。我会把我的所有三个文件,可能有人可以告诉我,为什么它是抛出这个错误。我使用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
ui7jx7zq

ui7jx7zq1#

insertLike的声明和定义具有不同的writeTo参数。
在你的头文件中,你有:

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++允许函数重载,你可以有多个同名的函数/方法,只要它们有不同的参数。参数类型是函数签名的一部分。
在这种情况下,以const char*作为第四个参数的insertLike和以char *作为第四个参数的insertLike不同的函数

vuktfyat

vuktfyat2#

虽然以前的海报涵盖了你的特定错误,但当你试图用g++编译C代码时,如果你不告诉编译器使用C链接,你可能会得到“未定义引用”链接器错误。
例如,你应该在你的C头文件中这样做:

extern "C" {

...

void myfunc(int param);

...

}

使'myfunc'在C++程序中可用。
如果您还想在C中使用它,请将extern "C" {} Package 在#ifdef __cplusplus预处理器条件中,如

#ifdef __cplusplus
extern "C" {
#endif

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

t0ybt7op

t0ybt7op3#

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

g++ main.c function_file.c
1yjd4xko

1yjd4xko4#

如果您使用CMake,也可能发生这种情况。如果你创建了一个新的类,并且你想示例化它,在构造函数调用时,你会收到这个错误-即使头文件和cpp文件是正确的-如果你没有相应地修改CMakeLists.txt
使用CMake,每次创建一个新类时,在使用它之前,必须将头文件、cpp文件和任何其他可编译文件(如Qt ui文件)添加到CMakeLists.txt中,然后重新运行cmake .
例如,在此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

isr3a4wc

isr3a4wc5#

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

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

在这种情况下,如果MyLib1依赖于MyLib2也是可以的。但是,如果reverse为true,则会得到未定义的引用。

muk1a3rh

muk1a3rh6#

正如Paul所说,这可能是链接器的问题,而不是编译器的错误。如果你仔细阅读你的构建输出/日志(可能需要在一个单独的IDE窗口中查看完整的细节),你可以判断问题是来自编译器(需要在代码中修复)还是来自链接器(需要在make/cmake/project级别修复以包括丢失的lib)。

相关问题