No puedo averiguar por qué esto no está funcionando. Voy a poner todos los tres de mis archivos y, posiblemente, alguien me puede decir por qué es tirar este error. Yo estoy usando el g++ para compilar el programa.

Programa:

#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;  
}

Función de archivo:

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;
}

Archivo de encabezado:

void insertLike(const char sentence[], const int lengthTo, const int length, const char writeTo[]);

El error es exactamente:

undefined reference to 'insertLike(char const*, int, int, char const*)'
collect2: ld returned 1 exit status
InformationsquelleAutor Mashew | 2010-11-09

4 Comentarios

  1. 22

    La declaración y definición de insertLike son diferentes

    En el archivo de encabezado:

    void insertLike(const char sentence[], const int lengthTo, const int length, const char writeTo[]);

    En su función de archivo:

    void insertLike(const char sentence[], const int lengthTo, const int length,char writeTo[]);

    C++ permite la sobrecarga de funciones, donde usted puede tener múltiples funciones/métodos con el mismo nombre, siempre y cuando tengan argumentos diferentes. Los tipos de argumentos son parte de la firma de la función.

    En este caso, insertLike que lleva const char* como cuarto parámetro y insertLike que lleva char * como cuarto parámetro se diferentes funciones.

    • Estoy totalmente /headfloor ahora.
    • A veces sólo se necesita un juego extra de ojos, el hombre. 🙂 Recuerdo que cuando yo estaba aprendiendo C, y me gustaría pasar la mitad de un día golpeando mi cabeza contra el teclado en la frustración, entonces mi padre-en-ley, llegaba a la casa y punto por encima de mi hombro, «falta un punto y coma no.» >.>
    • Bien, nunca tuvo un padre-en-ley. Probablemente la razón por la que me pasé más de la mitad de un día golpeando mi cabeza contra el teclado en la frustración 🙂
    • Hay alguna forma de pedir a la máquina para detectar este error para mí?
    • La máquina ¿ de detectar el error. El problema es que el OP no entendía de lo que la máquina le estaba diciendo. Supongo que sería posible que el compilador para reconocer la similitud entre la función declarada y definida de la función y hacer una sugerencia útil («¿quiere decir que …?»)
  2. 20

    Aunque anterior carteles cubierto su error en particular, usted puede conseguir ‘Undefined reference’ linker errores al intentar compilar el código C con g++, si usted no le dice al compilador que utilice C de vinculación.

    Por ejemplo, usted debe hacer esto en sus archivos de cabecera C:

    extern "C" {
    
    ...
    
    void myfunc(int param);
    
    ...
    
    }

    A hacer «myfunc’ disponible en los programas de C++.

    Si usted aún desea usar este de C, envuelva el extern "C" { y } en #ifdef __cplusplus condicionales del preprocesador, como

    #ifdef __cplusplus
    extern "C" {
    #endif

    De esta manera, el extern bloque acaba de ser «codificado» cuando se utiliza un compilador de C.

    • Gracias, este me detuvo de volverme loco. En el nick de tiempo!
    • El vinculador realmente debe comprobar para este caso y te dicen que hay un unmangled la versión de la función definida!
    • Gracias, ya esta resuelto para mí. Yo también necesitaba añadir: #ifdef __cplusplus extern «C» { #endif y #ifdef __cplusplus } #endif en la parte superior & fondo de mis archivos de cabecera C, ya que se hace referencia en C++ y C código.
    • He actualizado la respuesta a añadir el #ifdef bloques, ya que los comentarios no pueden tener formato de código… 🙂
    • es bueno que se agregó, sin embargo, la cuestión es sólo de etiquetado c++ así que creo que la habilidad para utilizar el mismo código en C debe ser más de un extra de observación.
    • tal vez la pregunta debería también ser etiquetados de C, debido a que este error ocurre realmente en que no mans land entre los dos idiomas. Mi código C que se estaba trabajando bien hasta que tuve que llamar desde un programa de C++, pero cuando hice el cambio recomendado aquí se comenzó a trabajar para C++, pero rompió mi programa en C, por lo tanto mi sugerencia.

  3. 14

    Usted necesita para compilar y vincular todos los archivos de origen juntos:

    g++ main.c function_file.c
    • Me doy cuenta de que esto es casi 5 años, pero soy un total de C++ novato y esto funcionó para mí. Gracias.
    • Mismo aquí, estaba tratando de compilar algunas VS código en una máquina Debian y acabo de encontrar esta, gracias por la respuesta! Usted puede incluso hacer g++ *.c, como por stackoverflow.com/questions/3202136/…
  4. 3

    Esto también puede suceder si usted está usando CMake. Si ha creado una nueva clase y desea crear instancias de ella, en la llamada al constructor recibirá este error -incluso cuando el encabezado y el cpp archivos son correctos – si no ha modificado CMakeLists.txt en consecuencia.

    Con CMake, cada vez que se crea una nueva clase, antes de usar el encabezado, el cpp archivos y cualquier otra compilable archivos (como Qt ui archivos) debe ser añadido a CMakeLists.txt y, a continuación, vuelva a ejecutar cmake . donde CMakeLists.txt se almacena.

    Por ejemplo, en este CMakeLists.txt de archivo:

    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 usted está utilizando el comando file(GLOB yourProject_SRC *.h *.cpp) a continuación, sólo tiene que volver a ejecutar el cmake . sin modificar CMakeLists.txt.

    • make rebuild_cache es otra manera de forzar a la reconfiguración. También, es por eso que no construya su CMakeLists de nombre de archivo GLOBs. Hay una razón por la que estamos llamados CMakeListas después de todo.

Dejar respuesta

Please enter your comment!
Please enter your name here