2

projectA.vcprojで

fileA.h

#ifdef __cplusplus
extern "C" {
#endif
void functionA();
#ifdef __cplusplus
}
#endif

fileA.c

void functionA()
{
//function defined
}

projectB.vcprojの場合:

fileB.h

void functionB() ;

fileB.cpp

#include "fileA.h"
#include "fileB.h"
void functionB() {
    functionA(); // error: undefined reference to 'functionA'
}

Linuxでコードをコンパイルするとエラーが発生します。これを修正するのを手伝ってください。

4

4 に答える 4

4

ファイルをリンクする必要があります。

ソースコード---コンパイル->オブジェクトファイル---リンク->アプリケーション

fileA.c ------------ +
                    | ---> fileA.o --------- +
                + --- + |
                | |
fileA.h -------- + +-> a.out
                | |
                + --- + |
                    | ---> fileB.o --------- +
fileB.cpp ---------- +

「XXXへの未定義の参照」エラーメッセージは、コンパイルが成功した後、リンカによって表示されます。

すべてのファイルが一緒にリンクされていることを確認する必要があります。

$ ls
fileA.c fileA.h fileB.cpp fileB.h
$ gcc -c fileA.c 
$ g ++ -c fileB.cpp
fileA.c fileA.h fileA.o fileB.cpp fileB.h fileB.o
$ g ++ fileA.o fileB.o 
$ ls
a.out fileA.c fileA.h fileA.o fileB.cpp fileB.h fileB.o
于 2012-07-13T17:23:30.417 に答える
1

エラーメッセージはおそらくリンカーからのものであるため、両方のソースファイルをコンパイルして正しくリンクする必要があります。

gcc -c fileA.c
g++ -c fileB.cpp
g++ -o program fileB.o fileA.o

もちろん、がfileA.c含まれていることを確認する必要がありますfileA.h。からヘッダーを省略し、fileA.c以下を使用してコードをコンパイルする場合:

g++ -c fileA.c                       # g++ instead of gcc
g++ -c fileB.cpp
g++ -o program fileB.o fileA.o

g++次に、C ++リンケージを作成したfunctionA()が、Cリンケージを呼び出すことを期待しているため、欠落している参照を取得しますfunctionA()

ただし、Cコードをg++;でコンパイルしないでください。それはトラブルを求めています。


最初に尋ねられたときfileB.cpp、ヘッダーは含まれていませんでした。

fileB.cpp

#include "fileB.h"
#include "fileA.h"  // Provide extern "C" declaration of functionA()
void functionB() {
    functionA();
}
于 2012-07-13T17:15:59.330 に答える
1

functionAのヘッダーファイルをfunctionBのヘッダーファイルにインクルードする必要があります。したがって、fileB.hに#include"fileA.h"という行を追加します。

于 2012-07-13T17:16:29.940 に答える
0

どのようにコンパイルしますか?

gcc filea.c fileb.cpp

トリックを行う必要があります。

于 2012-07-13T17:16:59.720 に答える