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
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.
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.
Vous devez compiler et lier tous vos fichiers source 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 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 .
où 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
.