我无法弄清楚为什么这不起作用。我会把我的所有三个文件都拿出来,也许有人可以告诉我它为什么会抛出这个错误。我正在使用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
答案 0 :(得分:22)
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 *
是不同的功能
答案 1 :(得分:20)
虽然之前的海报涵盖了您的特定错误,但是在尝试使用g ++编译C代码时,您可以获得“未定义的引用”链接器错误,如果您不告诉编译器使用C链接。
例如,您应该在C头文件中执行此操作:
extern "C" {
...
void myfunc(int param);
...
}
在C ++程序中使'myfunc'可用。
如果你还想在C中使用它,请将extern "C" {
和}
包装在#ifdef __cplusplus
预处理器条件中,例如
#ifdef __cplusplus
extern "C" {
#endif
这样,使用C编译器时,extern
块将被“跳过”。
答案 2 :(得分:14)
您需要编译并链接所有源文件:
g++ main.c function_file.c
答案 3 :(得分:2)
如果您使用CMake,也可能发生这种情况。如果您已经创建了一个新类并且想要实例化它,那么在构造函数调用时,您将收到此错误 - 即使标题和cpp
文件正确 - 如果您没有相应地修改CMakeLists.txt
使用CMake,每次创建新类时,在使用标题之前,必须将cpp
文件和任何其他可编译文件(如Qt ui
文件)添加到{{1}然后重新运行存储CMakeLists.txt
的{{1}}。
例如,在此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)
。
答案 4 :(得分:2)
如果要包含一个依赖于另一个库的库,那么包含的顺序也很重要:
g++ -o MyApp MyMain.o -lMyLib1 -lMyLib2
在这种情况下,MyLib1依赖于MyLib2是可以的。 但是,如果存在true,则将获得未定义的引用。
答案 5 :(得分:0)
正如Paul所说,这可能是一个链接程序投诉,而不是编译器错误。如果您仔细阅读了构建输出/日志(可能需要在单独的IDE窗口中查看完整的详细信息),则可以确定问题出在编译器(需要用代码解决)还是链接器(需要将在make / cmake / project级别进行修复,以包含缺少的库)。