programing

CMAKE의 OS 별 지침 : 방법?

nasanasas 2020. 11. 6. 08:22
반응형

CMAKE의 OS 별 지침 : 방법?


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

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


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

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

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

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

참고URL : https://stackoverflow.com/questions/9160335/os-specific-instructions-in-cmake-how-to

반응형