Usando bibliotecas C para programas C ++

Eu estou tentando controlar os servos Dynamixel usando uma GUI feita usando o Qt. O Dynamixel fornece um conjunto C de bibliotecas C para controlar os motores, enquanto a única maneira de fazer as GUIs que eu conheço é o Qt, que é essencialmente C ++. Será possível usar as bibliotecas Dynamixel C do código Qt C ++ de alguma forma?

Sim, o C ++ pode compilar o C com um compilador C ++ e você pode vincular o C ++ ao C. Apenas certifique-se de que qualquer function C que você chamar utilize o link C. Isso é feito colocando o protótipo de um extern "C"

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

Os headers da biblioteca já podem fazer isso, BTW.

Claro … C código é chamado de C ++ o tempo todo. Por exemplo, a maioria das bibliotecas de sistemas operacionais é escrita em C em vez de C ++. Portanto, sempre que você estiver criando syscalls a partir do seu código C ++ para executar tarefas que são entregues ao kernel do SO, elas estão passando por chamadas de código-C.

Apenas certifique-se de include os headers adequados e vincular as bibliotecas C em questão no momento da compilation. Lembre-se também de usar o extern "C" para especificar a binding C para as funções da biblioteca C, se os arquivos de header ainda não os declararam como tal. Tenha em mente que algumas bibliotecas podem não ter declarado suas funções usando especificamente o extern "C" , mas podem ter usado um token pré-processador para fazê-lo. Então, você também deve verificar isso antes de assumir que os criadores da biblioteca ainda não definiram sua biblioteca como tendo o vínculo C.

A vinculação de bibliotecas personalizadas usando o gcc pode ser feita com o switch -l . Se você precisar especificar um diretório personalizado para onde as bibliotecas estão localizadas, isso pode ser feito com a opção -L . Então, por exemplo:

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

Note que os switches -l e -L vêm depois dos arquivos de código ou object que você está compilando, e se você for uma biblioteca é algo como libjpg , librobotics , etc., elimine a parte de lib do nome quando for anexá-lo a a opção -l .

Você pode usar bibliotecas C de C ++ … no entanto, existem algumas advertências.

Uma grande coisa a observar ao usar bibliotecas C de terceiros com C ++ é o tratamento de erros.

Algumas bibliotecas C usam resources como setjmp / longjmp para manipulação de erros. (lua é um exemplo notável). Isso significa que no desenrolar da pilha de erros não ocorrerá da maneira normal e você poderá vazar resources. Coisas como os guardas habituais de estilo C ++ RAII para proteção de resources falham miseravelmente. (Essas chamadas são piores do que goto para o código C ++).

Também exceções podem ser uma preocupação. Se uma exceção de C ++ se propaga para um limite de C / C ++, o aplicativo pode finalizar em vez de propagar a exceção. (Dependendo de como a biblioteca C foi compilada e seu sistema operacional, etc.) (Você pode obter essa situação se passar uma function C ++ para uma biblioteca C como um retorno de chamada).

Sim. Para usar a function de biblioteca C, use o “C” externo, conforme abaixo, em seu programa .cpp, myprog.cpp.

 extern "C" { // C Function call cfunc(); } int main() { cfunc(); return 0; } 

Esta cfunc deve ser definida na biblioteca c como abaixo.

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

Então você precisa criar o arquivo object .o e os arquivos de objects compartilhados .so para sua biblioteca C como abaixo.

 $] 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 

Não se esqueça do extern "C" torno dos headers da biblioteca. Leia aqui Como funciona o “extern” de C?

Sim – C ++ pode usar bibliotecas C.

Este é um exemplo que usa libc a biblioteca C principal

 #include  int main() { printf("%s\n", "Hello world"); return 0; } 

Existe um driver C ++ para os servos Dynamixel no Rock Framework .

Intereting Posts