2

私の C++ プログラムから呼び出したい、他の誰かが作成した C ライブラリがあります。C ヘッダーは次のように構成されています。

#ifndef INC_MOVE_CLIENT_H
#define INC_MOVE_CLIENT_H

#ifdef __cplusplus
    extern "C" {
#endif

...

int serverConnect(const char *, const char *, MoveStateDeferred *);

...

#ifdef __cplusplus
}
#endif

#endif  // ... INC_MOVE_CLIENT_H

次のように、C++ プログラムで serverConnect を呼び出しています。

#include "helloworld.h"
#include "moveclient.h"

int main(int argc, const char* argv[]) {
    const char* ip = "192.168.1.2";
    const char* port = "7899";
    MoveStateDeferred* m;
    serverConnect(ip, port, m);
}

これらの指示によると、これは正しいように思えますが、コンパイルしようとすると次のようになります。

$ gcc helloworld.cpp -o helloworld.out
/tmp/ccuS93Yu.o: In function `main':
helloworld.cpp:(.text+0x3c): undefined reference to `serverConnect'
collect2: ld returned 1 exit status

moveclient.c には serverConnect が実装されており、他のファイルと同じディレクトリにあります。コンパイルに間違ったコマンドを使用していませんか? moveclient.c もコンパイルするために必要なことはありますか? それとも、コンパイルコマンドとは関係のないものですか?

4

3 に答える 3

6

これはコンパイルの問題ではなく、リンクの問題です。

moveclient.cそれが必要な唯一の追加ファイルであると仮定すると、いくつかのオプションがあります。

.cファイルをコンパイル行に追加できます。

g++ helloworld.cpp moveclient.c -o helloworld.out

または、.c(および.cpp)ファイルをオブジェクトファイルにコンパイルしてリンクすることもできます

g++ -c helloworld.cpp
gcc -c moveclient.c
g++ helloworld.o moveclient.o -o helloworld.out

または、moveclientのものをライブラリにリンクし、そのライブラリをリンクに追加することもできます。ライブラリを作成するための詳細は、システムと、共有ライブラリまたはダイナミックライブラリのどちらが必要かによって異なります。ただし、ライブラリを取得すると、ビルドラインは次のようになります(ライブラリがまたはと呼ばれると仮定しlibmoveclient.soますlibmoveclient.a

g++ helloworld.cpp -L. -lmoveclient

または、個別のコンパイルを使用している場合:

g++ -c helloworld.cpp
g++ helloworld.o -L. -lmoveclient
于 2012-08-01T05:51:50.400 に答える
4

コンパイルコマンドが間違っています。

通常、次のようなことを行います。

gcc -c helloworld.cpp -o helloworld.o
gcc -c moveclient.c -o moveclient.o
gcc    moveclient.o helloworld.o -o helloworld.out

...これにより、すべてのオブジェクトがリンクされます。

于 2012-08-01T05:46:32.330 に答える
3

ここまではすべて正しく実行しましたが、リンカに の実装を見つける場所を伝える必要もありますserverConnectmoveclient.cファイルがある場合は、次のようにします。

gcc helloworld.cpp moveclient.c -o helloworld.out
于 2012-08-01T05:45:53.117 に答える