なぜこれが機能しないのかわかりません。 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
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*
を4番目のパラメーターとして使用し、insertLike
はchar *
は、4番目のパラメーターとして異なる関数です。
以前のポスターで特定のエラーが説明されていましたが、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
ブロックは単に「スキップ」されます。
すべてのソースファイルをコンパイルしてリンクする必要があります。
g++ main.c function_file.c
これは、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
_を再実行するだけです。