40

なぜこれが機能しないのかわかりません。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
4

6 に答える 6

28

の宣言と定義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++ では関数のオーバーロードが許可されており、引数が異なる限り、同じ名前の複数の関数/メソッドを使用できます。引数の型は、関数のシグネチャの一部です。

この場合、4 番目のパラメーターとしてinsertLike取るものと、4 番目のパラメーターとして取るものは、異なる関数です。const char*insertLikechar *

于 2010-11-09T04:13:09.270 に答える
25

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

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

extern "C" {

...

void myfunc(int param);

...

}

C++ プログラムで「myfunc」を使用できるようにします。

これを C からも使用したい場合は、extern "C" {and}#ifdef __cplusplusプリプロセッサ条件でラップします。

#ifdef __cplusplus
extern "C" {
#endif

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

于 2013-02-28T16:46:42.557 に答える
23

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

g++ main.c function_file.c
于 2010-11-09T04:12:46.483 に答える
5

これは、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

于 2015-07-04T22:04:22.560 に答える
3

別のライブラリに依存するライブラリを含める場合は、含める順序も重要です。

g++ -o MyApp MyMain.o -lMyLib1 -lMyLib2

この場合、MyLib1 が MyLib2 に依存していれば問題ありません。ただし、reverse が true の場合は、未定義の参照が取得されます。

于 2020-01-27T08:41:24.987 に答える