문제

C로 크로스 플랫폼 애플리케이션을 작성할 때 가장 염두에 두어야 할 사항은 무엇입니까?타겟 플랫폼:32비트 Intel 기반 PC, Mac 및 Linux.저는 특히 Jungle Disk가 USB 데스크톱 버전에서 제공하는 다용성을 찾고 있습니다( http://www.jungledisk.com/desktop/download.aspx )

이러한 유형의 개발에 대한 팁과 "알고 있는 점"은 무엇입니까?

도움이 되었습니까?

해결책

나는 수년 동안 30개에 가까운 OS 및 컴파일러로 포팅된 ANSI C 네트워킹 라이브러리를 유지 관리했습니다.라이브러리에는 GUI 구성 요소가 없어 작업이 더 쉬워졌습니다.우리는 결국 플랫폼 전반에 걸쳐 일관성이 없는 모든 루틴을 전용 소스 파일로 추상화하고 해당 소스 파일에서 적절한 곳에 #define을 사용했습니다.이는 플랫폼별로 조정된 코드를 라이브러리의 주요 비즈니스 로직에서 분리된 상태로 유지했습니다.또한 필요한 경우 플랫폼별로 쉽게 변경할 수 있도록 typedef와 자체 전용 유형을 광범위하게 사용했습니다.이로 인해 64비트 플랫폼으로의 포팅이 상당히 쉬워졌습니다.

GUI 구성 요소를 찾고 있다면 WxWindows 또는 Qt(둘 다 C++ 라이브러리임)와 같은 GUI 도구 키트를 살펴보는 것이 좋습니다.

다른 팁

플랫폼 종속적인 #ifdef는 피하세요. 새 플랫폼을 추가하면 기하급수적으로 늘어나는 경향이 있기 때문입니다.대신 소스 파일을 루트에 플랫폼 독립적 코드가 있고 "리프"에 플랫폼 종속 코드가 있는 트리로 구성해 보세요.관련해서 좋은 책이 있는데, 다중 플랫폼 코드 관리.여기에 포함된 샘플 코드는 쓸모 없어 보일 수 있지만 책에 설명된 아이디어는 여전히 매우 중요합니다.

Kyle의 답변에 더해 강력히 추천합니다. ~에 맞서 Windows에서 Posix 하위 시스템을 사용하려고 합니다.Microsoft가 기능 시트 체크박스에서 "Posix 지원"을 주장할 수 있도록 최소한의 수준으로 구현되었습니다.아마도 실제로 누군가가 그것을 사용하고 있을지도 모르지만, 나는 실생활에서 그것을 본 적이 없습니다.

확실히 크로스 플랫폼 C 코드를 작성할 수 있습니다. 플랫폼 간의 차이점과 테스트, 테스트, 테스트만 인식하면 됩니다.단위 테스트와 CI(지속적 통합) 솔루션은 프로그램이 모든 대상 플랫폼에서 작동하는지 확인하는 데 큰 도움이 됩니다.

좋은 접근 방식은 시스템 종속 항목을 최대 하나 또는 몇 개의 모듈로 격리하는 것입니다.해당 모듈에서 시스템 독립적인 인터페이스를 제공합니다.그런 다음 해당 모듈 위에 다른 모든 것을 빌드하여 컴파일하는 시스템에 의존하지 않도록 하세요.

POSIX로 최대한 많이 작성해 보세요.Mac과 Linux는 기본적으로 POSIX를 지원하며 Windows에는 이를 실행할 수 있는 시스템이 있습니다(제가 아는 한 – 실제로 사용한 적은 없습니다).앱이 그래픽인 경우 Mac과 Linux 모두 X11 라이브러리(기본적으로 Linux, Mac에서 X11.app까지)를 지원하며 X11 앱을 Windows에서 실행할 수 있는 다양한 방법이 있습니다.

그러나 진정한 다중 플랫폼 배포를 찾고 있다면 거의 또는 전혀 변경 없이 여러 시스템에서 동일한 프로그램을 실행할 수 있는 Java 또는 Python과 같은 언어로 전환해야 할 것입니다.

편집하다:방금 애플리케이션을 다운로드하고 파일을 살펴보았습니다.하나의 디렉토리에 3개 플랫폼 모두에 대한 바이너리가 있는 것으로 보입니다.설정을 잃지 않고 컴퓨터에서 컴퓨터로 이동할 수 있는 앱을 작성하는 방법에 관심이 있는 경우 실행 파일과 동일한 디렉터리에 있는 파일에 모든 구성을 작성해야 하며 Windows 레지스트리를 건드리거나 Windows 레지스트리에 도트 디렉터리를 생성하지 않아야 합니다. Linux 또는 Mac에서 프로그램을 실행하는 사용자의 홈 폴더.그리고 교차 배포 Linux 바이너리를 생성하는 한 32비트 POSIX/X11이 아마도 가장 안전한 방법일 것입니다.현재 Mac을 사용하고 있기 때문에 JungleDisk가 무엇을 사용하는지 잘 모르겠습니다.

과거에 제가 작업한 예일 뿐인 이식 가능한 라이브러리는 거의 없습니다.

1) glib와 gtk+

2) libcurl

3) libapr

이는 거의 모든 플랫폼을 포괄하므로 매우 유용한 도구입니다.

Posix는 Unices에서는 괜찮지만 Windows에서는 그렇게 좋은지 의심스럽습니다. 게다가 휴대용 GUI를 위한 기능도 없습니다.

XVT에는 15년 이상 성숙되었으며 기본 창 도구 키트 위에 위치하는 크로스 플랫폼 GUI C API가 있습니다. WWW.XVT.COM을 참조하세요.

최소한 LINUX, Windows 및 MAC을 지원합니다.

또한 ifdef 대신 다양한 플랫폼의 코드를 다양한 모듈/트리로 분리하는 것이 좋습니다.

또한 플랫폼의 차이점과 이를 추상화하는 방법을 미리 확인하는 것이 좋습니다.예:이것은 일부 OS 관련 항목입니다(예:텍스트 파일의 성가신 CR, CRLF, LF) 또는 하드웨어 관련 항목입니다.예:이전에 언급한 posix 호환성이 여러분을 방해하지 않습니다.

int c;
fread(&c, sizeof(int), 1, file);

그러나 다른 하드웨어 플랫폼에서는 내부 메모리 레이아웃이 완전히 다를 수 있으므로(엔디아성) 일부 대상 플랫폼에서는 변환 기능을 사용해야 합니다.

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