Qtで作ったGUIを使ってDynamixelサーボを制御しようとしています。Dynamixel は、モーターを制御するためのC ライブラリの C セットを提供しますが、GUI を作成する唯一の方法は Qt であり、これは本質的に C++ です。Qt C++ コードから Dynamixel C ライブラリを何らかの方法で使用することは可能ですか?
7 に答える
はい、C++ は C++ コンパイラで C をコンパイルでき、C++ を C に対してリンクできます。呼び出す C 関数が C リンケージを使用していることを確認してください。これは、C 関数のプロトタイプをextern "C"
#ifdef __cplusplus
extern "C"{
#endif
void c_function_prototype();
#ifdef __cplusplus
}
#endif
使用しようとしているライブラリのヘッダーは、既にそれを行っている可能性があります。
確かに... 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
に来ることに注意してください。ライブラリが、 またはなどの場合は、スイッチに追加するときに名前の一部を削除してください。libjpg
librobotics
lib
-l
はい。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
C++ から C ライブラリを使用できます...ただし、いくつかの注意事項があります。
C++ でサードパーティの C ライブラリを使用する際に注意すべき重要な点の 1 つは、エラー処理です。
C ライブラリの中には、エラー処理にsetjmp
/のような機能を使用するものがあります。longjmp
(lua は注目すべき例です)。これは、エラー時にスタックの巻き戻しが通常の方法で行われず、リソースがリークする可能性があることを意味します。リソース保護のための通常の C++ RAII スタイル ガードのようなものは、陰気に失敗します。(これらの呼び出しはgoto
、C++ コードの場合よりも悪いです)。
また、例外が懸念される場合があります。C++ 例外が C/C++ 境界に伝播する場合、アプリケーションは例外を伝播するのではなく終了する可能性があります。(C ライブラリのコンパイル方法や OS などによって異なります) (C++ 関数を C ライブラリにコールバックとして渡すと、このような状況になる可能性があります。)
extern "C"
ライブラリヘッダーの周りを忘れないでください。ここを読んでください。Cの「外部」はどのように機能しますか?
はい - C++ は C ライブラリを使用できます。
これは、メインの C ライブラリである libc を使用する例です。
#include <cstdio>
int main()
{
printf("%s\n", "Hello world");
return 0;
}
Rock Frameworkには Dynamixel サーボ用のC++ ドライバーがあります。