Eu sou um iniciante no CMAKE. Abaixo está um arquivo cmake simples que funciona bem nas janelas do ambiente mingw. O problema é claramente com a target_link_libraries()
função do CMAKE ao qual estou vinculando libwsock32.a. No windows isso funciona e recebo os resultados.
No entanto, como esperado, no Linux, o /usr/bin/ld
procurará o -lwsock32
que NÃO está lá no sistema operacional Linux.
Meu problema é: Como faço para instruir o CMAKE para evitar vincular a biblioteca wsock32 no sistema operacional Linux ??
Qualquer ajuda será muito apreciada.
Meu arquivo CMake simples:
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.
Fonte: cmake.org/cmake/help/latest/command/if.htmlDado que este é um problema tão comum, postagem geronto:
Documentos de lógica booleana CMake
Nomes de plataforma CMake, etc.
fonte
APPLE
.(UNIX AND NOT APPLE)
... e o link de @mlvljr mudou para: gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/… agora.Em geral
Você pode detectar e especificar variáveis para vários sistemas operacionais como este:
Detectar Microsoft Windows
Ou:
Detectar Apple MacOS
Detectar Unix e Linux
Seu problema específico de vinculador
Para resolver seu problema com a
wsock32
biblioteca específica do Windows , basta removê-la de outros sistemas, assim:fonte
Você tem algumas palavras especiais do CMAKE, dê uma olhada:
fonte
STREQUAL
aceita variáveis (além de string) como primeiro operando, por isso poderia ser mais concisoif(CMAKE_SYSTEM_NAME STREQUAL "Linux")...
Expressões geradoras também são possíveis:
Isso irá vincular libA, wsock32 & libC no Windows e vincular libA, libB & libC no Linux
Expressões do gerador CMake
fonte
Tente isso:
Você pode encontrar outras variáveis úteis aqui .
fonte
Quero deixar isso aqui porque tive dificuldade com isso ao compilar para Android no Windows com o Android SDK.
O CMake distingue entre plataforma TARGET e HOST.
Meu TARGET era Android, então as variáveis como CMAKE_SYSTEM_NAME tinham o valor "Android" e a variável WIN32 da outra resposta aqui não foi definida. Mas eu queria saber se meu sistema HOST era Windows porque eu precisava fazer algumas coisas diferentes ao compilar no Windows ou Linux ou IOs. Para fazer isso, usei CMAKE_HOST_SYSTEM_NAME, que descobri ser pouco conhecido ou mencionado em qualquer lugar porque para a maioria das pessoas TARGEt e HOST são iguais ou não se importam.
Espero que isso ajude alguém em algum lugar ...
fonte
Use alguma macro de pré-processador para verificar se está no Windows ou Linux. Por exemplo
inclua -l $ (LIB) em seu comando de construção.
Você também pode especificar algum argumento de linha de comando para diferenciar ambos.
fonte