C++ неопределенная ссылка на определенную функцию
Я не могу понять, почему это не работает. Я поставлю все три моих файла, и, возможно, кто-то может сказать мне, почему он бросает эту ошибку. Я использую 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
4 ответов
декларация и определение 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[]);
C++ позволяет перегрузку функций, где вы можете иметь несколько функций / методов с тем же именем, если они имеют разные аргументы. Типы аргументов являются частью функций подпись.
в этом случае insertLike
Что происходит const char*
в качестве четвертого параметра и insertLike
Что происходит char *
в качестве четвертого параметра различные функции.
хотя предыдущие плакаты покрывали вашу конкретную ошибку, вы можете получить ошибки компоновщика "неопределенная ссылка" при попытке скомпилировать код C с помощью g++, Если вы не скажете компилятору использовать связь C.
например, вы должны сделать это в своих файлах заголовков C:
extern "C" {
...
void myfunc(int param);
...
}
чтобы сделать "myfunc" доступным в программах на C++.
если вы все еще хотите использовать это из C, обернуть extern "C" {
и }
на #ifdef __cplusplus
препроцессора условные, как
#ifdef __cplusplus
extern "C" {
#endif
таким образом,extern
блок будет просто "пропущены" при использовании компилятора C.
это также может произойти, если вы используете CMake. Если вы создали новый класс и хотите создать его экземпляр, при вызове конструктора вы получите эту ошибку-даже если заголовок и cpp
файлы верны-если вы не изменили CMakeLists.txt
соответственно.
С CMake, каждый раз, когда вы создаете новый класс, прежде чем использовать его заголовок,cpp
файлы и любые другие компилируемые файлы (например, Qt ui
файлы) должны быть добавлены к CMakeLists.txt
и затем повторно cmake .
где 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
.