Soy un principiante en CMAKE. A continuación se muestra un archivo cmake simple que funciona bien en las ventanas del entorno mingw. El problema es claramente con la target_link_libraries()
función de CMAKE donde estoy vinculando libwsock32.a. En Windows esto funciona y obtengo los resultados.
Sin embargo, como se esperaba, en Linux, /usr/bin/ld
buscará -lwsock32
cuál NO está en el sistema operativo Linux.
Mi problema es: ¿Cómo le indico a CMAKE que evite vincular la biblioteca wsock32 en el sistema operativo Linux?
Cualquier ayuda será apreciada.
Mi archivo 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.
Fuente: cmake.org/cmake/help/latest/command/if.htmlDado que este es un problema tan común, geronto-post:
CMake documentos de lógica booleana
Nombres de plataformas de CMake, etc.
fuente
APPLE
.(UNIX AND NOT APPLE)
... y el enlace de @mlvljr ha cambiado a: gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/… ahora.En general
Puede detectar y especificar variables para varios sistemas operativos como ese:
Detectar Microsoft Windows
O:
Detectar Apple MacOS
Detecta Unix y Linux
Su problema específico del vinculador
Para resolver su problema con la
wsock32
biblioteca específica de Windows , simplemente elimínela de otros sistemas, así:fuente
Tienes algunas palabras especiales de CMAKE, échale un vistazo:
fuente
STREQUAL
acepta variables (además de la cadena) como primer operando, por lo que podría ser más concisoif(CMAKE_SYSTEM_NAME STREQUAL "Linux")...
Las expresiones generadoras también son posibles:
Esto vinculará libA, wsock32 y libC en Windows y vinculará libA, libB y libC en Linux
Expresiones del generador de CMake
fuente
Trata eso:
Puede encontrar otras variables útiles aquí .
fuente
Quiero dejar esto aquí porque tuve problemas con esto al compilar para Android en Windows con el SDK de Android.
CMake distingue entre plataforma TARGET y HOST.
Mi OBJETIVO era Android, por lo que las variables como CMAKE_SYSTEM_NAME tenían el valor "Android" y la variable WIN32 de la otra respuesta aquí no estaba definida. Pero quería saber si mi sistema HOST era Windows porque necesitaba hacer algunas cosas de manera diferente al compilar en Windows, Linux o IO. Para hacer eso, utilicé CMAKE_HOST_SYSTEM_NAME que encontré que apenas se conoce o se menciona en ninguna parte porque para la mayoría de las personas TARGEt y HOST son lo mismo o no les importa.
Espero que esto ayude a alguien en algún lugar ...
fuente
Use alguna macro de preprocesador para verificar si está en Windows o Linux. Por ejemplo
incluya -l $ (LIB) en su comando de compilación.
También puede especificar algún argumento de línea de comando para diferenciar ambos.
fuente