son - tipos de error en c++
C++ referencia indefinida a funciĆ³n definida (4)
Aunque los carteles anteriores cubrieron su error particular, puede obtener errores del enlazador de ''Referencia no definida'' al intentar compilar el código C con g ++, si no le dice al compilador que use el enlace C.
Por ejemplo, debes hacer esto en tus archivos de cabecera C:
extern "C" {
...
void myfunc(int param);
...
}
Para que ''myfunc'' esté disponible en los programas de C ++.
Si aún desea usar esto desde C, ajuste las extern "C" {
y }
#ifdef __cplusplus
en #ifdef __cplusplus
condicionales del preprocesador, como
#ifdef __cplusplus
extern "C" {
#endif
De esta manera, el bloque extern
solo se "saltará" cuando se usa un compilador de C.
No puedo entender por qué esto no está funcionando. Pondré los tres archivos y posiblemente alguien pueda decirme por qué está generando este error. Estoy usando 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;
}
Archivo de función:
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 cabecera:
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
Esto también podría suceder si está utilizando CMake. Si ha creado una nueva clase y desea crear una instancia, en la llamada del constructor recibirá este error, incluso cuando el encabezado y los archivos cpp
son correctos, si no ha modificado CMakeLists.txt
consecuencia.
Con CMake, cada vez que cree una nueva clase, antes de usarla el encabezado, los archivos cpp
y otros archivos compilables (como los archivos CMakeLists.txt
ui
) se deben agregar a CMakeLists.txt
y luego volver a ejecutar cmake .
donde se almacena CMakeLists.txt
.
Por ejemplo, en este archivo 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 está utilizando el file(GLOB yourProject_SRC *.h *.cpp)
comando file(GLOB yourProject_SRC *.h *.cpp)
, solo necesita volver a ejecutar cmake .
sin modificar CMakeLists.txt
.
La declaración y definición de insertLike
son diferentes
En su archivo de cabecera:
void insertLike(const char sentence[], const int lengthTo, const int length,
const char writeTo [] );
En su ''archivo de función'':
void insertLike(const char sentence[], const int lengthTo, const int length,
char writeTo [] );
C ++ permite la sobrecarga de funciones, donde puede tener múltiples funciones / métodos con el mismo nombre, siempre y cuando tengan argumentos diferentes. Los tipos de argumento son parte de la firma de la función.
En este caso, insertLike
que toma const char*
como su cuarto parámetro e insertLike
que toma char *
como su cuarto parámetro son funciones diferentes .
Necesitas compilar y enlazar todos tus archivos fuente juntos:
g++ main.c function_file.c