멀티 플랫폼 (Windows, Linux) C/C++
라이브러리 프로젝트를 구성하는 일반적인/권장 방법은 무엇입니까?크로스 플랫폼 C/C++ 프로젝트 구성
함수 이름을 지정하고 OS 의존적 인 구현 방법을 제공하고, 등을 구성하는 방법은 무엇입니까? 제발, 건설적인 아이디어 만 - "Linux를보세요.", ideas strongly welcome
과 같은 조언이 없습니다.
멀티 플랫폼 (Windows, Linux) C/C++
라이브러리 프로젝트를 구성하는 일반적인/권장 방법은 무엇입니까?크로스 플랫폼 C/C++ 프로젝트 구성
함수 이름을 지정하고 OS 의존적 인 구현 방법을 제공하고, 등을 구성하는 방법은 무엇입니까? 제발, 건설적인 아이디어 만 - "Linux를보세요.", ideas strongly welcome
과 같은 조언이 없습니다.
이
FS/filesystem.hpp < 보여줍니다 - 당신이에 포함 무엇 주요 일반적인 헤더 모든 프로젝트와 거기에 #define을 만들면 사람이이 파일 만 포함하고 아래에 하위 파일이 포함되어 있으면이 파일을 포함 할 파일을 가리키는 컴파일 오류가 발생합니다.
FS/리눅스/filesystem.hpp < -
위의 주요 파일에 #ifdef와 리눅스와 #include하는 리눅스에 대한 헤더FS/창/filesystem.hpp < - #ifdef와 WINDOWS와 #include하는 창에 대한 헤더 리눅스에 구현
FS/창/filesystem.cpp < - - 창
에 대한 구현FS/리눅스/filesystem.cpp < 위의 주요 파일그럼 내 빌드 시스템에서 "$ target"을 사용하여 빌드 당 OS 관련 소스 파일을 쉽게 포함 할 수 있습니다.
트릭은 당신이 형식 정의를 그들 만이 볼 수 있도록 사용자로부터 숨길 수있는 인터페이스를 만드는 것입니다 및 구현 세부 사항이없는
개인적으로 클래스 정의에 걸쳐 여러 OS를 위해서 #ifdefs 뒤덮 소스 파일을 미워, 유형, 머리글 등을 포함하고 있으며, 나는 읽기 쉽도록 명료성과 편의성을 위해 모든 것을 조각화하는 것을 선호합니다.
많은 의존성은 사용하는 빌드 시스템에 따라 다릅니다. 많은 크로스 플랫폼 빌드 시스템에는 자체 구성 방식이 있습니다. 코드 자체에 관해서는
, 그것은 헤더를 제공하기 위해 드물지 않다, 그러나 주어진 시스템의 구현 파일에 대한 링크, 그래서 당신은 할 수 있습니다 :
system.h
system_linux.cpp
system_windows.cpp
system_osx.cpp
...
을 ... OS에 의존 물건의 수집.
하지만 모두 가장 좋은 방법은 실제로 (Linux보다 작은) 다중 플랫폼 프로젝트를 보는 것입니다. P.
CMake는 많은 플랫폼에서 좋은 메타 빌드 시스템입니다. 부스트는 대부분의 플랫폼에서 작동합니다. Qt도 매우 좋습니다.
의존성을 낮게 유지하려고 시도하십시오.
CMake 플랫폼에 대해 플랫폼 독립적 인 방식으로 질문을 해봅시다. Boost와 Qt는 플랫폼을 추상화하므로 걱정할 필요가 없습니다 (그만큼).
+1 부스트와 Qt를 사용하여 플랫폼을 추상화합니다. 사실 Windows 나 Unix API를 사용할 필요가 없습니다. –
내가 사용하는 접근법은 모든 OS 관련 기능을 내 인터페이스로 랩핑하는 것입니다. 그런 다음 각기 다른 OS (주로 Windows 및 Linux)에 대해이 인터페이스를 구현합니다.
컴파일 타임에 전처리기를 사용하여 플랫폼을 확인한 다음 적절한 버전을 포함시킵니다.
스레드, 디스크 I/O 및 클럭/시간이 많습니다.
예를 들어:
나는이 예로서 종속 헤더/소스 파일을 저장할 폴더를 사용#ifdef _WIN32
#include <windows.h>
#include "windows_code.h"
#elif __linux
#include <unistd.h>
#include <pthread.h>
#include "linux_code.h"
#else
#error "Unrecognized Platform"
#endif
이에 대한 규칙은 하나도 없습니다. 다른 사람들은 여러 가지 이유로 다르게합니다. – Mat
아이디어가 필요하고 규칙이 없습니다. – Cartesius00
그런 다음 [faq] (http://stackoverflow.com/faq#dontask)를 다시 확인하십시오. 이 사이트는 모든 대답이 똑같이 (주관적) 유효한 질문에는 적합하지 않습니다. – Mat