C ++ undefinierter Bezug auf definierte Funktion
-
29-09-2019 - |
Frage
ich kann nicht herausfinden, warum dies nicht funktioniert. Ich werde alle meine drei Dateien stellen und möglicherweise kann mir jemand sagen, warum es diesen Fehler zu werfen. Ich bin mit g ++, um das Programm zu kompilieren.
Programm:
#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;
}
Funktion Datei:
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;
}
Header-Datei:
void insertLike(const char sentence[], const int lengthTo, const int length, const char writeTo[]);
Der Fehler genau ist:
undefined reference to 'insertLike(char const*, int, int, char const*)'
collect2: ld returned 1 exit status
Lösung
Die Deklaration und Definition von insertLike
sind unterschiedliche
In Ihrer Header-Datei:
void insertLike(const char sentence[], const int lengthTo, const int length,
const char WriteTo [] );
In Ihrer 'Funktion Datei':
void insertLike(const char sentence[], const int lengthTo, const int length,
char WriteTo [] );
C ++ ermöglicht Funktion Überlastung, wo Sie mehrere Funktionen / Methoden mit dem gleichen Namen haben können, solange sie unterschiedliche Argumente haben. Die Argumenttypen sind Teil der Funktion Unterschrift.
In diesem Fall insertLike
die const char*
als vierten Parameter und insertLike
nimmt die char *
als vierte Parameter nimmt sind verschiedene Funktionen .
Andere Tipps
Obwohl vorherige Poster abgedeckt Ihre speziellen Fehler, können Sie ‚Nicht definierte Referenz‘ Linker Fehler erhalten, wenn Sie versuchen, C-Code mit g ++ kompiliert, wenn Sie C-Bindung nicht dem Compiler sagen zu verwenden.
Zum Beispiel sollten Sie dies in Ihren C-Header-Dateien:
extern "C" {
...
void myfunc(int param);
...
}
Um 'myfunc' in C ++ Programme.
Wenn Sie auch noch diese von C verwenden möchten, wickeln Sie das extern "C" {
und }
in #ifdef __cplusplus
Präprozessor conditionals, wie
#ifdef __cplusplus
extern "C" {
#endif
Auf diese Weise wird der extern
Block nur sein „übersprungen“, wenn ein C-Compiler.
Sie müssen kompilieren und verknüpfen alle Quelldateien zusammen:
g++ main.c function_file.c
Dies könnte auch passieren, wenn Sie CMake verwenden. Wenn Sie eine neue Klasse erstellt haben, und Sie wollen es instanziiert, am Konstruktoraufruf erhalten Sie diesen Fehler -Auch wenn der Header und die cpp
Dateien Richtig- sind, wenn Sie CMakeLists.txt
dementsprechend nicht geändert haben.
Mit CMake, jedes Mal, wenn Sie eine neue Klasse erstellen, bevor es in den Header, die cpp
Dateien und alle anderen übersetzbare Dateien (wie Qt ui
-Dateien) verwenden, müssen zu CMakeLists.txt
hinzugefügt werden und dann wieder laufen cmake .
wo CMakeLists.txt
gespeichert wird.
Zum Beispiel in dieser CMakeLists.txt
-Datei:
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})
Wenn Sie den Befehl file(GLOB yourProject_SRC *.h *.cpp)
verwenden, dann nur Sie wieder laufen cmake .
müssen ohne CMakeLists.txt
zu ändern.