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 )
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
É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()
Vous pouvez détecter et spécifier des variables pour plusieurs systèmes d'exploitation comme celui-ci:
if(WIN32)
# for Windows operating system in general
endif()
Ou:
if(MSVC OR MSYS OR MINGW)
# for detecting Windows compilers
endif()
if(Apple)
# for MacOS X or iOS, watchOS, tvOS (since 3.10.3)
endif()
if(UNIX AND NOT Apple)
# for Linux, BSD, Solaris, Minix
endif()
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()
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
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
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 .