web-dev-qa-db-ja.com

C ++プログラムでのCライブラリの使用

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

35
johngreen

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

#ifdef __cplusplus
extern "C"{
#endif 

void c_function_prototype();

#ifdef __cplusplus
}
#endif

ところで、ライブラリのヘッダーは既にそれを行っているかもしれません。

50
André Oriani

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

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

gccを使用してカスタムライブラリをリンクするには、-lスイッチを使用します。ライブラリがある場所のカスタムディレクトリを指定する必要がある場合は、-Lスイッチを使用して指定できます。したがって、たとえば:

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

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

12
Jason

はい。 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");
}

次に、Cライブラリの.oオブジェクトファイルと.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
7
user966588

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

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

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

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

7

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

5
ssgreg

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

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

#include <cstdio>

int main()
{
   printf("%s\n", "Hello world");
   return 0;
}
3
Adrian Cornish

Rock Framework には、ダイナミクセルサーボ用の C++ドライバー があります。

2
Jakob