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
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.
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.
Vous devez compiler et lier tous vos fichiers sources Ensemble:
g++ main.c function_file.c
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 .
où 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
.