2009-10-27 4 views
17

오늘 D 프로그래밍에 대해 들었고 C 코드와 호환됩니다. 그럼에도 불구하고 D에서 GTK 나 PortAudio와 같은 C 라이브러리를 사용할 수 있는지 여부에 대한 정보는 찾지 못했습니까? 가능한 경우이 작업을 수행하는 방법을 설명해 주시겠습니까?D에서 C 라이브러리를 사용하는 방법은 무엇입니까?

답변

18

D에서 C 라이브러리를 호출 할 수 있습니다. C 헤더 파일을 D로 변환해야합니다. 대부분의 경우이 방법은 매우 간단하며 도움을주기는 어렵습니다. command-line tool 프로세스를 자동화하십시오. 그것은 장난감 예제와 관련해서는 절대로 실제로 작동하지 않지만 수행해야 할 변형의 종류를 확인하는 것은 좋은 출발이 될 수 있습니다. 머리글로 번역하는 데 어려움을 겪고있는 코드 조각을 넣고 htod가 그 코드로 수행하는 작업을 확인하십시오.

대개 발생하는 가장 큰 문제는 C 전처리 기의 창의적인 사용입니다. 어떤 것은 D에서 version() 문으로 바뀔 수 있지만 전부는 아닙니다.

실제로 코드를 컴파일하고 링크하는 방법은 유닉스 계열 플랫폼에서 GCC를 사용하여 C 코드로 컴파일하고 링크 할 수 있다고 생각합니다. Windows에서 DMC를 사용하여 C 파일을 컴파일하고 DMD와 링크해야합니다. 또는 C 코드를 컴파일 할 수있는 컴파일러를 사용하여 DLL로 컴파일 한 다음 DMD와 연결하여 DLL에서 DMD 호환 가져 오기 라이브러리를 만들어야합니다. 이것은 DigitalMars에서 구할 수있는 무료 Basic Utilities Package에있는 implib 도구를 사용하여 수행 할 수 있습니다.

이미 많은 헤더 번역이 수행되었습니다. 먼저 Dsource의 Bindings 프로젝트를 검색하거나 GTK 헤더를 번역하는 것과 같은 큰 일을하기 전에 digitalmars D 뉴스 그룹에 먼저 문의하는 것이 유용합니다.

4

D 코드는 C 개체 파일과 연결될 수 있으며 C DLL과 상호 작용할 수 있지만 사용할 C 헤더 파일에서 D 모듈을 생성해야합니다. 공식 D 웹 사이트는 바로 그 일을하기 위해 a guide입니다.

1

시작 얻을 도움이 될 많은 프로젝트가 있습니다 : GTK 같은 인기있는 라이브러리의 많은 이미 (GTKD 예를 들어, 여기에) 포장되었다. This answer 설명 방법.

4

인기있는 대안은 런타임 중에 라이브러리를로드하는 것입니다.

module libpngtest; 

import std.stdio; 
import core.sys.posix.dlfcn; 

alias uint function() png_access_version_number_t; 

int main() { 
    auto lib = dlopen("libpng.so".ptr, RTLD_LAZY | RTLD_LOCAL); 
    if (lib is null) { 
    writeln("EEEK!"); 
    writeln(to!string(dlerror())); 
    return -1; 
    } else { 
    writeln("WOOT!"); 
    auto png_access_version_number = cast(png_access_version_number_t)dlsym(lib, "png_access_version_number"); 
    writeln(png_access_version_number()); 
    } 

    if (dlclose(lib) == 0) { 
    return 0; 
    } else { 
    return -1; 
    } 
} // main() function 

// compile: dmd libpngtest.d -L-ldl 
// run:  ./libpngtest 

을 테스트 할 DPaste를 사용 : http://www.dpaste.dzfl.pl/917bc3fb

을 여기의 libpng 기능의 libpng를로드하고 호출하는 방법을 예입니다
관련 문제