web-dev-qa-db-fra.com

Référence non définie C ++ à la fonction définie

Je ne peux pas comprendre pourquoi cela ne fonctionne pas. Je vais mettre en place mes trois fichiers et peut-être que quelqu'un peut me dire pourquoi il lance 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;
}

En tête de fichier:

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
27
Mashew

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

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,caractère 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 est différentes fonctions.

22
Mud

Bien que les affiches précédentes aient couvert votre erreur particulière, vous pouvez obtenir des erreurs de l'éditeur de liens 'Référence non définie' lorsque vous essayez de compiler du code C avec g ++, si vous ne dites pas au compilateur d'utiliser la liaison C.

Par exemple, vous devez 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 souhaitez toujours l'utiliser à partir de C, enveloppez le extern "C" { et } dans #ifdef __cplusplus conditionnelles du préprocesseur, comme

#ifdef __cplusplus
extern "C" {
#endif

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

20
MattK

Vous devez compiler et lier tous vos fichiers source ensemble:

g++ main.c function_file.c
15
casablanca

Cela peut également se produire si vous utilisez CMake. Si vous avez créé une nouvelle classe et que vous souhaitez l'instancier, lors de l'appel du constructeur, vous recevrez cette erreur - même lorsque l'en-tête et les fichiers cpp 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 d'utiliser l'en-tête, les fichiers cpp et tout autre fichier compilable (comme les fichiers Qt ui) doivent être ajoutés à CMakeLists.txt, puis réexécutez cmake .CMakeLists.txt est stocké.

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.

4
AxeEffect