CMAKE의 OS 별 지침 : 방법? PROJECT(biourl) set (${PROJECT_NAME}_headers ./BioSocketAddress.h

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 )



답변

사용하다

if (WIN32)
    #do something
endif (WIN32)

또는

if (UNIX)
    #do something
endif (UNIX)

또는

if (MSVC)
    #do something
endif (MSVC)

또는 유사

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


답변

이것이 일반적인 문제라는 점을 감안할 때 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 플랫폼 이름 등


답변

일반적으로

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

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()


답변

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

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


답변

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

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 생성기 표현식


답변

시도해보십시오.

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

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

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


답변

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는 동일하거나 상관하지 않기 때문에 거의 알려지지 않았거나 어디에서나 언급되었습니다.

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