Подтвердить что ты не робот

С++ undefined ссылка на определенную функцию

Я не могу понять, почему это не работает. Я выложу все три моих файла и, возможно, кто-нибудь скажет мне, почему он выбрасывает эту ошибку. Я использую 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
4b9b3361

Ответ 1

Объявление и определение 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 [] );

С++ допускает перегрузку функций, где вы можете иметь несколько функций/методов с тем же именем, если у них разные аргументы. Типы аргументов являются частью сигнатуры функции.

В этом случае insertLike, который принимает const char* в качестве своего четвертого параметра и insertLike, который принимает char * в качестве своего четвертого параметра различные функции.

Ответ 2

Хотя предыдущие плакаты покрывали вашу конкретную ошибку, вы можете получить 'Undefined ссылку' ошибки компоновщика при попытке скомпилировать C-код с g++, если вы не сообщите компилятору использовать ссылку C.

Например, вы должны сделать это в своих файлах заголовков C:

extern "C" {

...

void myfunc(int param);

...

}

Сделать "myfunc" доступным в программах на С++.

Если вы все еще хотите использовать это из C, оберните условия extern "C" { и } в #ifdef __cplusplus препроцессора, например

#ifdef __cplusplus
extern "C" {
#endif

Таким образом, блок extern будет просто "пропущен" при использовании компилятора C.

Ответ 3

Вам необходимо скомпилировать и связать все исходные файлы вместе:

g++ main.c function_file.c

Ответ 4

Это также может произойти, если вы используете CMake. Если вы создали новый класс и хотите его создать, при вызове конструктора вы получите эту ошибку - даже если файлы заголовка и cpp верны - если вы не изменили CMakeLists.txt соответственно.

При использовании CMake каждый раз, когда вы создаете новый класс, перед его использованием в CMakeLists.txt следует добавить заголовок, файлы cpp и любые другие компилируемые файлы (например, файлы Qt ui), а затем повторно запустить 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.