C++ référence indéfinie à une fonction définie

Je ne peux pas comprendre pourquoi cela ne fonctionne pas. Je vais mettre en place tous les trois de mes fichiers et peut-être que quelqu'un peut me dire pourquoi il jette cette erreur. J'utilise g++ pour compiler le programme.

Programme:

#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;  
}

Fichier de fonction:

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;
}

Fichier d'en-Tête:

void insertLike(const char sentence[], const int lengthTo, const int length, const char writeTo[]);

L'erreur est exactement:

undefined reference to 'insertLike(char const*, int, int, char const*)'
collect2: ld returned 1 exit status
25
demandé sur Mashew 2010-11-09 07:08:13

4 réponses

La déclaration et la définition de insertLike sont différents

Dans votre fichier d'en-tête:

void insertLike(const char sentence[], const int lengthTo, const int length, const char writeTo[]);

Dans votre 'fichier de fonction':

void insertLike(const char sentence[], const int lengthTo, const int length,char writeTo[]);

C++ permet la surcharge de fonctions, où vous pouvez avoir plusieurs fonctions/méthodes avec le même nom, tant qu'elles ont des arguments différents. Les types d'arguments font partie de la signature de la fonction.

Dans ce cas, insertLike qui prend const char* comme quatrième paramètre et insertLike qui prend char * comme quatrième paramètre sont différentes fonctions de.

20
répondu Mud 2017-01-06 00:40:27

Bien que les affiches précédentes aient couvert votre erreur particulière, vous pouvez obtenir des erreurs de linker 'Undefined reference' lorsque vous tentez de compiler du code C avec g++, si vous ne dites pas au compilateur d'utiliser la liaison C.

Par exemple, vous devriez le faire dans vos fichiers D'en-tête C:

extern "C" {

...

void myfunc(int param);

...

}

Pour rendre' myfunc ' disponible dans les programmes C++.

Si vous voulez toujours l'utiliser à partir de C, enveloppez les extern "C" { et } dans les conditions du préprocesseur #ifdef __cplusplus, comme

#ifdef __cplusplus
extern "C" {
#endif

De cette façon, le bloc extern sera simplement "ignoré" lors de l'utilisation d'un compilateur C.

19
répondu MattK 2017-09-08 11:17:26

Vous devez compiler et lier tous vos fichiers sources Ensemble:

g++ main.c function_file.c
15
répondu casablanca 2010-11-09 04:12:46

Cela peut également se produire si vous utilisez CMake. Si vous avez créé une nouvelle classe et que vous souhaitez instancier, à l'appel du constructeur, vous recevrez ce message d'erreur même lorsque l'en-tête et le cpp fichiers sont corrects - si vous n'avez pas modifié CMakeLists.txt en conséquence.

Avec CMake, chaque fois que vous créez une nouvelle classe, avant de l'utiliser l'en-tête, les fichiers cpp et tous les autres fichiers compilables (comme les fichiers Qt ui) doivent être ajoutés à CMakeLists.txt, puis réexécutez cmake .CMakeLists.txt est stocker.

Par exemple, dans ce fichier 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})

Si vous utilisez la commande file(GLOB yourProject_SRC *.h *.cpp), il vous suffit de relancer cmake . sans modifier CMakeLists.txt.

2
répondu AxeEffect 2015-07-04 22:04:22