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 avectarget_link_libraries()
fonction de CMAKE où je lie libwsock32.a. Dans Windows, cela fonctionne et j'obtiens les résultats.
Cependant, comme prévu, sous Linux, le /usr/bin/ld
cherchera -lwsock32
ce qui n'est PAS là sur le système d'exploitation Linux.
Mon problème est le suivant: comment demander à CMAKE d'éviter de lier la bibliothèque wsock32 sous Linux OS ???
Toute aide sera fortement appréciée.
Mon fichier CMake simple:
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 )
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Étant donné qu'il s'agit d'un problème si courant, geronto-posting:
Documentation sur la logique booléenne CMake
Noms des plateformes CMake, etc.
la source
APPLE
.(UNIX AND NOT APPLE)
... et le lien de @mlvljr a changé en: gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/… maintenant.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
Ou:
Détecter Apple MacOS
Détecter Unix et Linux
Votre problème d'éditeur de liens spécifique
Pour résoudre votre problème avec la
wsock32
bibliothèque spécifique à Windows , supprimez-la simplement des autres systèmes, comme ça:la source
Vous avez quelques mots spéciaux de CMAKE, jetez un œil:
la source
STREQUAL
accepte les variables (en plus de la chaîne) comme premier opérande, donc cela pourrait être le plus concisif(CMAKE_SYSTEM_NAME STREQUAL "Linux")...
Les expressions génératrices sont également possibles:
Cela liera libA, wsock32 et libC sous Windows et reliera libA, libB et libC sous Linux
Expressions du générateur CMake
la source
Essayez ça:
Vous pouvez trouver d'autres variables utiles ici .
la source
Je veux laisser cela ici car j'ai eu du mal avec cela lors de la compilation pour Android sous Windows avec le SDK Android.
CMake fait la distinction entre la plate-forme TARGET et HOST.
Mon TARGET était Android, donc les variables comme CMAKE_SYSTEM_NAME avaient la valeur "Android" et la variable WIN32 de l'autre réponse ici n'était pas définie. Mais je voulais savoir si mon système HOST était Windows parce que je devais faire certaines choses différemment lors de la compilation sous Windows, Linux ou IO. Pour ce faire, j'ai utilisé CMAKE_HOST_SYSTEM_NAME qui, selon moi, est à peine connu ou mentionné, car pour la plupart des gens, TARGEt et HOST sont identiques ou s'en moquent.
J'espère que cela aide quelqu'un quelque part ...
la source
Utilisez une macro de préprocesseur pour vérifier si elle est sous Windows ou Linux. Par exemple
incluez -l $ (LIB) dans votre commande de construction.
Vous pouvez également spécifier un argument de ligne de commande pour différencier les deux.
la source