CMAKE의 OS 별 지침 : 방법?


109

CMAKE의 초보자입니다. 아래는 mingw 환경 창에서 잘 작동하는 간단한 cmake 파일입니다. 문제는 target_link_libraries()내가 libwsock32.a를 연결하는 CMAKE의 기능에 분명히 있습니다. Windows에서 이것은 작동하고 결과를 얻습니다.

그러나 예상대로 Linux에서는 Linux OS에없는 것을 /usr/bin/ld찾습니다 -lwsock32.

내 문제는 : Linux OS에서 wsock32 라이브러리를 연결하지 않도록 CMAKE에 어떻게 지시합니까 ???

어떤 도움이라도 대단히 감사하겠습니다.

내 간단한 CMake 파일 :

 PROJECT(biourl)
 set (${PROJECT_NAME}_headers ./BioSocketAddress.h  ./BioSocketBase.h ./BioSocketBuffer.h ./BioSocketCommon.h  ./BioSocketListener.h  ./BioSocketPrivate.h  ./BioSocketStream.h ./BioUrl.h BioDatabase.h )

set (${PROJECT_NAME}_sources BioSocketAddress.C  BioSocketBase.C  BioSocketCommon.C BioSocketStream.C  BioUrl.C BioDatabase.C )

add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_headers} ${${PROJECT_NAME}_sources} )

# linkers
#find_library(ws NAMES wsock32 PATHS ${PROJECT_SOURCE_DIR} NO_SYSTEM_ENVIRONMENT_PATH NO_DEFAULT_PATH)

target_link_libraries(${PROJECT_NAME} bioutils wsock32)

install (TARGETS ${PROJECT_NAME}
       RUNTIME DESTINATION bin
       LIBRARY DESTINATION lib
       ARCHIVE DESTINATION lib/archive )

답변:


147

사용하다

if (WIN32)
    #do something
endif (WIN32)

또는

if (UNIX)
    #do something
endif (UNIX)

또는

if (MSVC)
    #do something
endif (MSVC)

또는 유사

참조 CMake 유용한 변수CMake 점검 플랫폼을


Solaris에서 무엇을 사용합니까?
jww

링크 된 페이지는 도움이되지만 WIN32 또는 UNIX에 대해서는 언급하지 않습니다. 다른 / 유사한 리소스가 있습니까?
rchilton1980

1
아, 찾았어요. UNIX, WIN32 및 아마도 모든 "피어"를 언급합니다. cmake.org/Wiki/CMake_Checking_Platform
rchilton1980

2
@ rchilton1980 : 페이지, 새로운 링크 이동 gitlab.kitware.com/cmake/community/wikis/doc/cmake/...
schnaader

궁금한 사람 : Per legacy, the else() and endif() commands admit an optional <condition> argument. If used, it must be a verbatim repeat of the argument of the opening if command.Source : cmake.org/cmake/help/latest/command/if.html
Zyl

75

이것이 일반적인 문제라는 점을 감안할 때 geronto-posting :

    if(UNIX AND NOT APPLE)
        set(LINUX TRUE)
    endif()

    # if(NOT LINUX) should work, too, if you need that
    if(LINUX) 
        message(STATUS ">>> Linux")
        # linux stuff here
    else()
        message(STATUS ">>> Not Linux")
        # stuff that should happen not on Linux 
    endif()

CMake 부울 논리 문서

CMake 플랫폼 이름 등


9
을 (를) 언급 해 주셔서 감사합니다 APPLE.
Victor Sergienko

@VictorSergienko Всегда рад помочь :
mlvljr

3
유닉스가 리눅스라고 가정하지 마십시오. cmake_system_name에 대한 cmake 유용한 변수 웹 사이트 링크. Linux 혼합 케이스 OS 검출기 사용
don bright

티 뷰르의 대답은 더
돈 밝은

1
예, FreeBSD도 통과 할 것입니다 (UNIX AND NOT APPLE)... 그리고 @mlvljr의 링크가 gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/…로 변경되었습니다 .
SlySven

47

일반적으로

다음과 같은 여러 운영 체제에 대한 변수를 감지하고 지정할 수 있습니다.

Microsoft Windows 감지

if(WIN32)
    # for Windows operating system in general
endif()

또는:

if(MSVC OR MSYS OR MINGW)
    # for detecting Windows compilers
endif()

Apple MacOS 감지

if(APPLE)
    # for MacOS X or iOS, watchOS, tvOS (since 3.10.3)
endif()

Unix 및 Linux 감지

if(UNIX AND NOT APPLE)
    # for Linux, BSD, Solaris, Minix
endif()

특정 링커 문제

Windows 관련 wsock32라이브러리 의 문제를 해결하려면 다음과 같이 다른 시스템에서 제거하면됩니다.

if(WIN32)
    target_link_libraries(${PROJECT_NAME} bioutils wsock32)
else
    target_link_libraries(${PROJECT_NAME} bioutils)
endif()

2
Solaris에서 무엇을 사용합니까?
jww

1
오타 : MSVS는 MSVC 여야합니다. ... 나는 당신을 위해 편집에 그것을 시도했지만 유래는 몇 가지 이유보다 6 개 문자는 편집을 허용하지 않습니다
mchiasson

1
문서에 따르면, "APPLE"은 우리가 애플 타겟을 구축하고 있다는 것을 의미 할뿐입니다. 즉, OSX뿐만 아니라 iOS, watchOS 등도 신뢰할 수있는 방식으로 OS X를 감지 할 수있는 방법이 있습니까?

당신은 아이폰 OS, tvOS 또는 watchOS 위해 구축하는 경우 @Julien, 당신은 가장 가능성 cmake 툴체인 파일, 사용하게 될 겁니다 해야 그는 당신이 찾고있는 무엇을 달성하기 위해이 사용될 수에 변수 세트의 일부 종류가 있습니다.
mchiasson

@Julien FWIW는 다음 cmake의 문서 만이 아니라 이후 아이폰 OS, watchOS, tvOS가 포함되어 있는지 확인 3.10.3
itMaxence

19

CMAKE의 특별한 단어가 있습니다.

if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
    // do something for Linux
else
    // do something for other OS

3
표준 CMake 방식 : 내부적으로 일관성없습니다. :) [이것은 하나의 정답 / 정답입니다.]
mlvljr

이러한 검색은 여기 이름의 목록입니다 github.com/Kitware/CMake/blob/master/Modules/...
AT

STREQUAL그것은 더 간결한 될 수 있도록 첫 번째 피연산자 (문자열 이외에) 변수를 수용if(CMAKE_SYSTEM_NAME STREQUAL "Linux")...
광고 N

11

생성기 표현식도 가능합니다.

target_link_libraries(
    target_name
    PUBLIC
        libA
        $<$<PLATFORM_ID:Windows>:wsock32>
    PRIVATE
        $<$<PLATFORM_ID:Linux>:libB>
        libC
)

그러면 Windows에서는 libA, wsock32 및 libC가 연결되고 Linux에서는 libA, libB 및 libC가 연결됩니다.

CMake 생성기 표현식


감사합니다. ">"를 추가하면됩니다. "$ <$ <PLATFORM_ID : Windows> : wsock32>"
wow2006

6

시도해보십시오.

if(WIN32)
    set(ADDITIONAL_LIBRARIES wsock32)
else()
    set(ADDITIONAL_LIBRARIES "")
endif()

target_link_libraries(${PROJECT_NAME} bioutils ${ADDITIONAL_LIBRARIES})

여기에서 다른 유용한 변수를 찾을 수 있습니다 .


이것은 효과가 있었고 매우 직관적이기 때문에 개인적으로 이것을 좋아합니다. 대단히 감사합니다.
Prasad

2

Android SDK를 사용하여 Windows에서 Android 용으로 컴파일 할 때 어려움을 겪었으므로 여기에 남겨두고 싶습니다.

CMake는 TARGET과 HOST 플랫폼을 구분합니다.

내 TARGET은 Android 였으므로 CMAKE_SYSTEM_NAME과 같은 변수의 값은 "Android"이고 다른 답변의 변수 WIN32는 정의되지 않았습니다. 하지만 Windows, Linux 또는 IO에서 컴파일 할 때 몇 가지 다른 작업을 수행해야했기 때문에 HOST 시스템이 Windows인지 알고 싶었습니다. 그렇게하기 위해 CMAKE_HOST_SYSTEM_NAME을 사용했습니다. 대부분의 사람들에게 TARGEt와 HOST는 동일하거나 상관하지 않기 때문에 거의 알려지지 않았거나 어디에서나 언급되었습니다.

이것이 누군가 어딘가에 도움이되기를 바랍니다 ...


-5

일부 전 처리기 매크로를 사용하여 Windows 또는 Linux에 있는지 확인하십시오. 예를 들면

#ifdef WIN32
LIB= 
#elif __GNUC__
LIB=wsock32
#endif

빌드 명령에 -l $ (LIB)를 포함하십시오.

둘 다 구별하기 위해 몇 가지 명령 줄 인수를 지정할 수도 있습니다.


6
사용자가 CMake 메이크 파일을 요청합니다.
tibur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.