web-dev-qa-db-ja.com

定義済み関数へのC ++未定義参照

なぜこれが機能しないのかわかりません。 3つすべてのファイルを作成します。おそらく、このエラーがスローされる理由を誰かが教えてくれるでしょう。プログラムのコンパイルに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
27
Mashew

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++では、関数のオーバーロードが可能です。引数が異なる限り、同じ名前の複数の関数/メソッドを使用できます。引数の型は、関数の署名の一部です。

この場合、insertLikeconst char*を4番目のパラメーターとして使用し、insertLikechar *は、4番目のパラメーターとして異なる関数です。

22
Mud

以前のポスターで特定のエラーが説明されていましたが、Cリンケージを使用するようコンパイラーに指示しないと、g ++でCコードをコンパイルしようとすると「未定義参照」リンカーエラーが発生する可能性があります。

たとえば、Cヘッダーファイルでこれを行う必要があります。

extern "C" {

...

void myfunc(int param);

...

}

「myfunc」をC++プログラムで使用可能にするため。

それでもCからこれを使用したい場合は、extern "C" {および} in #ifdef __cplusplusプリプロセッサ条件

#ifdef __cplusplus
extern "C" {
#endif

このように、Cコンパイラを使用する場合、externブロックは単に「スキップ」されます。

20
MattK

すべてのソースファイルをコンパイルしてリンクする必要があります。

g++ main.c function_file.c
15
casablanca

これは、CMakeを使用している場合にも発生する可能性があります。 _CMakeLists.txt_を変更していない場合、新しいクラスを作成し、それをインスタンス化する場合、コンストラクター呼び出しで、ヘッダーとcppファイルが正しい場合でも、このエラーを受け取ります。それに応じて。

CMakeでは、ヘッダーを使用する前に新しいクラスを作成するたびに、cppファイルとその他のコンパイル可能なファイル(Qt uiファイルなど)を_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_を再実行するだけです。

4
AxeEffect