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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top