С++ undefined ссылка на определенную функцию
Я не могу понять, почему это не работает. Я выложу все три моих файла и, возможно, кто-нибудь скажет мне, почему он выбрасывает эту ошибку. Я использую g++ для компиляции программы.
Программа:
#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;
}
Функциональный файл:
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;
}
Заголовочный файл:
void insertLike(const char sentence[], const int lengthTo, const int length, const char writeTo[]);
Ошибка:
undefined reference to 'insertLike(char const*, int, int, char const*)'
collect2: ld returned 1 exit status
Ответы
Ответ 1
Объявление и определение insertLike
отличаются
В вашем файле заголовка:
void insertLike(const char sentence[], const int lengthTo, const int length,
const char writeTo [] );
В вашем "функциональном файле":
void insertLike(const char sentence[], const int lengthTo, const int length,
char writeTo [] );
С++ допускает перегрузку функций, где вы можете иметь несколько функций/методов с тем же именем, если у них разные аргументы. Типы аргументов являются частью сигнатуры функции.
В этом случае insertLike
, который принимает const char*
в качестве своего четвертого параметра и insertLike
, который принимает char *
в качестве своего четвертого параметра различные функции.
Ответ 2
Хотя предыдущие плакаты покрывали вашу конкретную ошибку, вы можете получить 'Undefined ссылку' ошибки компоновщика при попытке скомпилировать C-код с g++, если вы не сообщите компилятору использовать ссылку C.
Например, вы должны сделать это в своих файлах заголовков C:
extern "C" {
...
void myfunc(int param);
...
}
Сделать "myfunc" доступным в программах на С++.
Если вы все еще хотите использовать это из C, оберните условия extern "C" {
и }
в #ifdef __cplusplus
препроцессора, например
#ifdef __cplusplus
extern "C" {
#endif
Таким образом, блок extern
будет просто "пропущен" при использовании компилятора C.
Ответ 3
Вам необходимо скомпилировать и связать все исходные файлы вместе:
g++ main.c function_file.c
Ответ 4
Это также может произойти, если вы используете CMake. Если вы создали новый класс и хотите его создать, при вызове конструктора вы получите эту ошибку - даже если файлы заголовка и cpp
верны - если вы не изменили CMakeLists.txt
соответственно.
При использовании CMake каждый раз, когда вы создаете новый класс, перед его использованием в CMakeLists.txt
следует добавить заголовок, файлы cpp
и любые другие компилируемые файлы (например, файлы Qt ui
), а затем повторно запустить cmake .
где CMakeLists.txt
сохраняется.
Например, в этом файле 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})
Если вы используете команду file(GLOB yourProject_SRC *.h *.cpp)
, вам просто нужно повторно запустить cmake .
без изменения CMakeLists.txt
.