51

Qtで作ったGUIを使ってDynamixelサーボを制御しようとしています。Dynamixel は、モーターを制御するためのC ライブラリの C セットを提供しますが、GUI を作成する唯一の方法は Qt であり、これは本質的に C++ です。Qt C++ コードから Dynamixel C ライブラリを何らかの方法で使用することは可能ですか?

4

7 に答える 7

68

はい、C++ は C++ コンパイラで C をコンパイルでき、C++ を C に対してリンクできます。呼び出す C 関数が C リンケージを使用していることを確認してください。これは、C 関数のプロトタイプをextern "C"

#ifdef __cplusplus
extern "C"{
#endif 

void c_function_prototype();

#ifdef __cplusplus
}
#endif

使用しようとしているライブラリのヘッダーは、既にそれを行っている可能性があります。

于 2012-08-22T04:32:49.853 に答える
20

確かに... C コードは常に C++ から呼び出されます。たとえば、ほとんどの OS ライブラリは C++ ではなく C で記述されています。したがって、OS カーネルに渡されるタスクを実行するために C++ コードから syscall を作成するときはいつでも、それらは C コード呼び出しを経由します。

コンパイル時に適切なヘッダーと問題の C ライブラリへのリンクを含めるようにしてください。extern "C"また、ヘッダー ファイルで C ライブラリ関数が C リンケージとして宣言されていない場合は、C ライブラリ関数の C リンケージを指定するために使用することも忘れないでください。一部のライブラリは、特に を使用して関数を宣言していない可能性がありますが、そのextern "C"ためにプリプロセッサ トークンを使用している可能性があることに注意してください。そのため、ライブラリの作成者がそのライブラリを C リンケージを持つものとしてまだ定義していないと仮定する前に、それについても確認する必要があります。

を使用してカスタム ライブラリをリンクgccするには、-lスイッチを使用します。ライブラリが配置されているカスタム ディレクトリを指定する必要がある場合は、-Lスイッチを使用して実行できます。たとえば、次のようになります。

g++ -std=c++11 my_code.cpp -lmy_library -L/custom_directory_path

-lおよびスイッチは、コンパイルしているコードまたはオブジェクト ファイルの-Lに来ることに注意してください。ライブラリが、 またはなどの場合は、スイッチに追加するときに名前の一部を削除してください。libjpglibroboticslib-l

于 2012-08-22T04:29:40.473 に答える
11

はい。C ライブラリ関数を使用するには、.cpp プログラム myprog.cpp で以下のように extern "C" を使用します。

extern "C" {
    // C Function call
    cfunc();
}

int main()
{
    cfunc();
    return 0;
}

この cfunc は、以下のように c ライブラリで定義する必要があります prog.c

#include <stdio.h>

void cfunc()
{
   printf("This is from c library");
}

.o次に、以下のように C ライブラリのオブジェクト ファイルと.so共有オブジェクト ファイルを作成する必要があります。

$] gcc -c prog.c -o prog
$] gcc -shared -o libprog.so prog.o

$] export LD_LIBRARY_PATH=/path/to/clibrary:$LD_LIBRARY_PATH
$] g++ -L/path/to/clibrary myprog.cpp -o myprog.o -lprog
于 2015-03-07T10:46:51.387 に答える
8

C++ から C ライブラリを使用できます...ただし、いくつかの注意事項があります。

C++ でサードパーティの C ライブラリを使用する際に注意すべき重要な点の 1 つは、エラー処理です。

C ライブラリの中には、エラー処理にsetjmp/のような機能を使用するものがあります。longjmp(lua は注目すべき例です)。これは、エラー時にスタックの巻き戻しが通常の方法で行われず、リソースがリークする可能性があることを意味します。リソース保護のための通常の C++ RAII スタイル ガードのようなものは、陰気に失敗します。(これらの呼び出しはgoto、C++ コードの場合よりも悪いです)。

また、例外が懸念される場合があります。C++ 例外が C/C++ 境界に伝播する場合、アプリケーションは例外を伝播するのではなく終了する可能性があります。(C ライブラリのコンパイル方法や OS などによって異なります) (C++ 関数を C ライブラリにコールバックとして渡すと、このような状況になる可能性があります。)

于 2012-08-22T04:59:31.017 に答える
6

extern "C"ライブラリヘッダーの周りを忘れないでください。ここを読んでください。Cの「外部」はどのように機能しますか?

于 2012-08-22T04:33:15.417 に答える
3

はい - C++ は C ライブラリを使用できます。

これは、メインの C ライブラリである libc を使用する例です。

#include <cstdio>

int main()
{
   printf("%s\n", "Hello world");
   return 0;
}
于 2012-08-22T04:29:24.470 に答える
2

Rock Frameworkには Dynamixel サーボ用のC++ ドライバーがあります。

于 2012-08-23T08:00:57.913 に答える