내가 원하는 호출하는 C 라이브러리"mysql.h"에서 녹 언어

StackOverflow https://stackoverflow.com/questions/9450224

  •  13-11-2019
  •  | 
  •  

문제

나에 연결하려는 mysql 에서 녹 코드입니다.나가려고 이러한 단계입니다.

    1.내가 쓴 c 를 사용하여 코드 mysql.h, 고 명령은 아래.
    
     $ gcc -shared mysqlrust.c -o libmysqlrust.so  $(mysql_config --cflags) $(mysql_config --libs)   $(mysql_config --cflags)
     $ cp libmysqlrust.so /usr/local/lib/rustc/i686-unknown-linux-gnu/lib/
    
    2.내가 쓴 녹 코드는 전화 libmysqlrust.so.

하지만 난 그러지 않을 그림을 사용하는 방법 C 유형 구조"MYSQL", "MYSQL_RES", "MYSQL_ROW".을 보여주십시오 나는 방법을 사용하는 c 형식이 구조에서 녹 코드입니다.

도움이 되었습니까?

해결책

개인정보 취급 관련 안정성 확보하는 어떤 방법을 자동으로 만들어 녹 유형의 정의에서는 C 구조체.이러한 상황에서 수있는 몇 가지 방법을 진행합니다.을 알지 못하는 것 MySQL API,말할 수 없는 정확하게 당신이해야 할 수 있습니다,하지만 여기에 몇 가지 옵션이 있습니다.

1)그들을 치료하는 완전히 불투명으로 포인터입니다.

이는 최상의 상황에서,그에 따라 달라집 C API 상 구조체의 포인터로 가고,그것의 자신의 생성과 소멸자 기능을 제공하고자 접근 기능을 위해 당신이 무엇을 액세스하는 데 필요 내부 구조체.이러한 경우에 당신은 단지 정의 type MYSQL = ctypes::void 만 적으로 사용이 안전하지 않은 포인터 *MYSQL.때로는 가장 쉬운 경로를 작성하는 것이 자신의 C 래퍼 간격을 안으로 메우고 이 시나리오를 가능합니다.

나머지 모든 시나리오를 재정을 포함 녹 데이터 구조와 동일한 구조로 C 구조체.녹려 놓으로 데이터 구조와 호환되는 방식으로 C(그래도 하지 않는 항상 성공을 아직),그래서 그것은 종종 가능성 녹 기록하거나 열거된 크기 정렬하고의 레이아웃 C struct 습니다.을 확인하고 싶을 것이 당신의 형식을 사용하여 core::ctypes, 그들은 정의와 일치하는 다양한 공통의 C 형식입니다.

Note ctypes 모듈 갈 것입니다 곧은 포괄적인 libc 호환성 모듈이 있습니다.

2)정의 녹 기록하는 부분적으로 올바른입니다.

는 경우에는 API 를 제공합 생성자 및 소멸자,하지만 당신은 여전히 일부에 대한 액세스 분야의 구조체,당신은 정의할 수 있는 충분한 구조체의에 필 당신 걱정을 무시하는 것처럼 정확한 크기 및 정렬.예: type MSQL = { filler1: ctypes::int, ..., connector_fd: *ctypes::char }.당신이 중지 할 수 있을 정의하는 구조체에서 마지막 분야 관 때문에 당신은 C 함수를 할당하에 힙으로 올바른 크기 및 정렬.에서 녹 코드에 당신은 항상 그것을 참조하십시오으로 안전하지 않은 포인: let mysql: *MYSQL = mysqlrust::create_mysql();

3)정의 녹 기록 올바른 크기 및 정렬,걱정 없는 내용입니다.

지 않는 경우가 생성자/소멸자 기능이 필요하거나 저장하는 구조체 스택에,하지만 당신은 그렇지 않으면 접근 기능을 조작하는 내용의 구조체,당신은 정의할 필요가 녹 기록 올바른 크기 및 정렬.이렇게하려면,단지 추가 분야의 유형 uint (항상 포인터 크기)또는 튜플의 uint, 까지 모두의 C sizeofcore::sys::size_of 에 동의합니다.패 u8s 는 경우는 크기가 아닙 여러 포인터의 크기입니다.을 받고 오른쪽 정렬은 더 신비로운 프로세스,그러나 사용하여 uint 필드 당신은 일반적으로 끝날 것이 사용할 수 있는 정렬(어쩌면 내가 정말로 아무 생각이 얼마나 정확한 그 문은).

가 테스트에 정신을 확인하는 녹 C 에 동의 크기를 보호하기 위해에 대하여 미래의 파손.

3)실제로 정의 전체 C 구조체.

이것은 아주 끔찍한 상황에 대한 큰 구조체,그리고 그것은 가능한 이론적으로,그러나 나는 생각하지 않는 사람은 그것을 수행에 대한 구조체 크로 MYSQL.나는 그것을 피할 수 있습니다.결국은 있을 것이고 최적화를 하는 c 컴파일러 기반 도구를 자동으로 이루어진다.

여기에는 몇 가지 예 interop C 구조체:

https://github.com/jdm/rust-socket/blob/master/socket.rs -이 재정의 다양한 소켓 구조체를 추가하는 자리에 대한 필드 그것에 관심이 없다.참고 사용하는 u8 패딩,그러나 내가 생각하 uint 생산될 가능성이 더 큽니다 올바른 정렬.

https://github.com/erickt/rust-zmq/blob/master/zmq.rs

https://github.com/pcwalton/rust-spidermonkey -이 한을 보여 줍니다 interop 다소 복잡한 API 를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top