web-dev-qa-db-ja.com

オブジェクトファイルのリンク中の「未定義の参照」エラー

この質問は この非常に包括的な答え を含むさまざまな方法で尋ねられていることを理解していますが、多くを調べて、エラーを修正して無駄にしてみました。

.cppおよび.cファイルを使用してプログラムを作成しています。すべてのファイルをg ++でコンパイルしましたが、リンクエラーはもうないようですが、C構文に関連する多くのC++エラーが表示されました。これは私が使用したコマンドでした:

g++ -o program main.cpp /data/*.c -l[...libs]

Main.cppは.cファイル内の関数を呼び出します。次に、1つのコンパイラで.cファイルと.cppファイルの両方をコンパイルするのではなく、一方にgcc、もう一方にg ++を使用して、オブジェクトファイルをリンクするだけでよいことを理解しました。

だから私はこれをしました(.cファイルはライブラリの一部であり、すでに.oファイルがあります)

g++ -c main.cpp
g++ -o program main.o /data/*.o -l[..libs]

しかし、ここでは、main.cppからプリコンパイルされた.cファイルに呼び出された関数の「未定義の参照」エラーが発生します。これは、以前には発生しなかったエラーです。

誰か助けてもらえますか?それとも、もっと情報を提供する必要があるのでしょうか?

編集(コードのより深い抜粋、私は単純化しようとしましたが、そうしないとこれは読むことが不可能になりますが、それでも何かを追加する必要がある場合は知らせてください、不要なコードを削除しようとします):

main.cpp:

#include "header.h"

int main(int argc, char** argv) {
    string s1 = argv[2];
    fn1(s1)
}

header.h

void fn1(string s1)

mycfile.c

#include "header.h"

void fn1(string s1){
    fprintf(stdout, " you entered %s", s1);
    fflush(stdout);
}

回答:

@Smeeheyは解決策を理解するのに役立ちましたが、実際には、使用していた.hppファイルに古いヘッダーがまだ含まれていました。しかし、コアソリューションは確かに外部C {}を使用するものでした。

7
Victor.dMdB

これは、C-vs-C++リンケージで行う可能性が高いです。 main.cppには、おそらく次のようなものがあります。

#include <data/header.h>

ここで、header.hはCライブラリを指します。次のように置き換えます。

extern "C" {
#include <data/header.h>
}

これは、ヘッダーから必要なシンボルを定義するときにc ++スタイルの名前マングリングを使用しないようにc ++コンパイラーに指示し、リンカーがcコンパイル済み.oファイルでそれらを正常に検出できるようにします。

12
Smeeheey

Cファイルはgccコマンドでコンパイルし、C++ファイルはgccまたはg++でコンパイルし、g++コマンドでリンクする必要があります。このシーケンスはおそらく機能します:

 gcc -c data/*.c main.cpp
 g++ -o program *.o -l <libs...>

次のステップ:適切なメイクファイルの作成方法を学びます。

2

これは暗闇の中でのショットですが、問題は、CファイルとCppファイルのコンパイル方法が似ているが、わずかに異なる可能性があることです...名前空間のため、関数fooはシンボルsome_prefix@foo Cとは異なり、gooは記号gooを生成します

.cppファイルで次のことを試してください

extern "C" { #include "yourcfilesheader.h" }

コードを添付してください

0
DrPrItay