Mas*_*hew 27 c++ g++ undefined-reference
我无法弄清楚为什么这不起作用.我会把我的所有三个文件都拿出来,也许有人可以告诉我它为什么会抛出这个错误.我正在使用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
Mud*_*Mud 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 *作为其第四参数是不同的功能.
Mat*_*ttK 20
虽然之前的海报涵盖了您的特定错误,但是如果您不告诉编译器使用C链接,那么在尝试使用g ++编译C代码时,您可能会收到"未定义的引用"链接器错误.
例如,您应该在C头文件中执行此操作:
extern "C" {
...
void myfunc(int param);
...
}
使'myfunc'在C++程序中可用.
如果您还想在C中使用它,请将extern "C" {and 包装}在#ifdef __cplusplus预处理器条件中,例如
#ifdef __cplusplus
extern "C" {
#endif
这样,extern当使用C编译器时,块将被"跳过".
cas*_*nca 15
您需要编译并链接所有源文件:
g++ main.c function_file.c
如果您使用 CMake,这也可能发生。如果您创建了一个新类并且想要实例化它,那么在构造函数调用时您将收到此错误 - 即使标题和cpp文件是正确的 - 如果您没有进行CMakeLists.txt相应的修改。
使用 CMake,每次创建新类时,在使用它之前,必须将头cpp文件、文件和任何其他可编译文件(如 Qtui文件)添加到存储位置CMakeLists.txt,然后重新运行。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.