C ++ неопределенная ссылка на определенную функцию - PullRequest
27 голосов
/ 09 ноября 2010

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

22 голосов
/ 09 ноября 2010

Декларация и определение 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 * в качестве четвертого параметра, являются различными функциями .

20 голосов
/ 28 февраля 2013

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

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

extern "C" {

...

void myfunc(int param);

...

}

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

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

#ifdef __cplusplus
extern "C" {
#endif

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

14 голосов
/ 09 ноября 2010

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

g++ main.c function_file.c
3 голосов
/ 05 июля 2015

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

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

...