sourcecode

C++ 프로그램에 대한 C 라이브러리 사용

copyscript 2022. 7. 27. 23:54
반응형

C++ 프로그램에 대한 C 라이브러리 사용

Qt를 사용하여 만든 GUI를 사용하여 Dynamixel Servo를 제어하려고 합니다.Dynamixel은 모터를 제어하기 위한 C 라이브러리의 C 세트를 제공하지만, GUI를 만드는 유일한 방법은 본질적으로 C++인 Qt입니다.Qt C++ 코드에서 Dynamicixel C 라이브러리를 사용할 수 있습니까?

네, 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로 작성됩니다.따라서 C++ 코드에서 syscall을 생성하여 OS 커널로 인계된 태스크를 실행할 때는 항상 C-code 콜을 통과합니다.

컴파일 시 해당 C라이브러리에 대한 적절한 헤더와 링크를 포함해야 합니다.또한 헤더 파일이 C-라이브러리 함수의 C-linkage를 아직 선언하지 않은 경우 를 사용하여 C-라이브러리 함수의 C-linkage를 지정합니다.일부 라이브러리는 특별히 다음을 사용하여 기능을 선언하지 않을 수 있습니다.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 라이브러리에서 정의해야 합니다.c

#include <stdio.h>

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

그런 다음 다음 다음을 작성해야 합니다..o오브젝트 파일 및.soC 라이브러리의 공유 객체 파일:

$] 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++와 함께 사용할 때 주의해야 할 중요한 점은 오류 처리입니다.

일부 C 라이브러리는 다음과 같은 시설을 사용합니다.setjmp/longjmp에러 처리를 실시합니다.(lua는 주목할 만한 예입니다).즉, 에러 스택에서는 정상적인 방법으로 언와인딩이 이루어지지 않고 리소스가 누출될 수 있습니다.자원 보호를 위한 일반적인 C++RAII 스타일의 가드와 같은 것은 완전히 실패합니다.(이러한 콜은 다음 콜보다 더 나쁨)gotoC++ 코드의 경우).

예외도 문제가 될 수 있습니다.C++ 예외가 C/C++ 경계로 전파되는 경우 응용 프로그램은 예외를 전파하지 않고 종료될 수 있습니다(C 라이브러리의 컴파일 방법 및 OS 등에 따라 다름). (C++ 함수를 콜백으로 C 라이브러리에 전달하면 이 상황이 발생할 수 있습니다.)

잊지 마세요extern "C"라이브러리 머리글을 둘러쌉니다.여기를 읽어주세요.C의 "외부"는 어떻게 작동합니까?

Rock Framework에는 Dynamicel 서보용 C++ 드라이버가 있습니다.

네 - C++는 C 라이브러리를 사용할 수 있습니다.

이 예에서는 메인 C 라이브러리를 libc로 사용하고 있습니다.

#include <cstdio>

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

언급URL : https://stackoverflow.com/questions/12066279/using-c-libraries-for-c-programs

반응형