문제

Windows, Linux 및 임베디드 대상을 위해 하나의 프로젝트를 컴파일해야합니다. 응용 프로그램은 호스트 또는 임베디드 대상에서 실행할 때 동작 차이가 있습니다. 내 요구 사항을 요약하려면 여기 테이블이 있습니다.

   Target               Compiler      Behavior
   Windows              MSVC, gcc         A
   Host Linux           gcc               A
   Embedded Linux       cross pltf gcc    B

컴파일러와 환경 적 차이를 자동으로 인식하는 makefile을 만들고 싶습니다 (매개 변수를 전달/수동으로 정의 할 필요없이). C 소스 파일 레벨에서 조건부 컴파일 만 사용하여 이러한 문제를 해결할 수 있습니까?
나는 지금까지 Automake를 사용하지 않습니다.

도움이 되었습니까?

해결책

그만큼 autotools 이 문제를 해결하기 위해 만들어졌습니다. Makefile 자체는 이것을 할 수 없습니다.

조건부 편집은 이러한 컴파일러가 정의 할 수있는 몇 가지 매크로가 있습니다 (예 : _MSC_VER MSVC ++의 경우 _WIN32 창문 및 및 __linux__ Linux의 경우). 또한 GCC가 제공합니다 다른 CPU 대상을 처리하기위한 주장.

Target         Compiler     Conditional
Windows        MSVC++       #ifdef _MSC_VER
Windows        gcc          #if defined(_WIN32) && defined(__GNUC__)
Linux          gcc          #if defined(__linux__) && defined(__GNUC__)
Platform (x86) gcc          #if #cpu(i386)
Platform (arm) gcc          #if #cpu(arm)

그것은 당신의 목적에 충분해야합니다.

다른 팁

내 대답은 : 아마. 환경의 차이에 따라 다릅니다.

각 환경에 대해 GCC의 사전 처리기가 사전 정의한 매크로 목록을 생성합니다. 빈 파일을 만드는 것만 큼 foo.h, 다음과 같은 명령을 실행하십시오. gcc -E -dM foo.h 각 환경에 대해. 각 환경에 대해 출력을 다른 파일로 리디렉션합니다.

그런 다음 사전 정의 된 매크로를 비교하고 청구서에 맞는 매크로를 찾으십시오. 귀하의 질문에서, 당신은 내장 환경이 Windows 및 호스트 Linux 플랫폼과 다른 동작을 가지고 있음을 나타냅니다. 임베디드 환경에 다른 칩 아키텍처를 사용하고 있다고 가정하면 아키텍처를 나타내는 매크로 정의가 있어야합니다. 예를 들어 64 비트 리눅스 박스에서 __x86_64__ 정의됩니다.

해당 정보가 있으면 해당 매크로를 조건부 가치로 사용하십시오.

#ifdef MACRO_INDICATING_EMBEDDED
// Behavior B
#else
// Behavior A
#endif

GCC가 정의합니다

 __linux__

Linux에서 컴파일 할 때. MSVC는 비슷한 것을 정의합니다.

그러나 실제로 구성 방법을 배워야합니다. 그게 그게 뭐야. 배우는 고통이지만 매우 유용합니다 (Automake, Autoconf 등)

사전 정의 된 매크로의 조합을 시도 할 수 있습니다 운영체제 그리고 아키텍처; 아마도 흥미로운 것 : 컴파일러 ID.

보다 정교한 빌드 시스템을 사용하지 않으려면 makefile 내에서 명령 줄 인수를 구문 분석 할 수 있습니다. 간단한 예는 추가하는 것입니다 .exe Windows에서 이름을 실행합니다. 이것을 위해 나는 makefile 안에 이와 같은 코드가 있습니다.

ifeq ($(target),win32)
    foo_binary := $(foo_binary).exe
endif

그리고 a make.bat 파일 포함

@make.exe target=win32 %*
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top