web-dev-qa-db-fra.com

Instructions spécifiques à l'OS dans CMAKE: Comment?

Je suis un débutant à CMAKE. Vous trouverez ci-dessous un simple fichier cmake qui fonctionne bien dans les fenêtres d’environnement mingw. Le problème est clairement avec target_link_libraries() fonction de CMAKE où je lie libwsock32.a. Dans Windows cela fonctionne et je reçois les résultats.

Cependant, comme prévu, sous Linux, le /usr/bin/ld va chercher -lwsock32 qui n’est PAS présent sur le système d’exploitation Linux.

Mon problème est: comment demander à CMAKE d'éviter de lier la bibliothèque wsock32 dans un système d'exploitation Linux?

Toute aide sera fortement appréciée.

Mon fichier Simple 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 )
66
Prasad

Utilisation

if (WIN32)
    #do something
endif (WIN32)

ou

if (UNIX)
    #do something
endif (UNIX)

ou

if (MSVC)
    #do something
endif (MSVC)

ou similaire

voir Variables utiles CMake et Plateforme de vérification CMake

99
relaxxx

Étant donné que c'est un problème si commun, 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()

documentation de la logique booléenne CMake

Noms de plate-forme CMake, etc.

53
mlvljr

En général

Vous pouvez détecter et spécifier des variables pour plusieurs systèmes d'exploitation comme celui-ci:

Détecter Microsoft Windows

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

Ou:

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

Détecter Apple MacOS

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

Détecter Unix et Linux

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

Votre problème spécifique de l'éditeur de liens

Pour résoudre votre problème avec la bibliothèque wsock32 Spécifique à Windows, supprimez-le simplement des autres systèmes, comme celui-ci:

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

Vous avez des mots spéciaux de CMAKE, jetez un oeil:

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

Les expressions de générateur sont également possibles:

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

Ceci reliera libA, wsock32 et libC sous Windows et reliera libA, libB et libC sous Linux

Expressions du générateur CMake

6
Cascades

Essayez ça:

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

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

Vous pouvez trouver d'autres variables utiles ici .

5
tibur