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

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


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


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

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

extern "C" {

...

void myfunc(int param);

...

}

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

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

#ifdef __cplusplus
extern "C" {
#endif

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


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

g++ main.c function_file.c

это также может произойти, если вы используете 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.