Jestem początkującym w CMAKE. Poniżej znajduje się prosty plik cmake, który dobrze działa w oknach środowiska mingw. Problem jest wyraźnie ztarget_link_libraries()
funkcji CMAKE, w której łączę libwsock32.a. W oknach to działa i otrzymuję wyniki.
Jednak, zgodnie z oczekiwaniami, w Linuksie /usr/bin/ld
będzie szukać tego, -lwsock32
czego NIE ma w systemie operacyjnym Linux.
Mój problem to: Jak poinstruować CMAKE, aby unikał łączenia biblioteki wsock32 w systemie Linux?
Każda pomoc będzie bardzo mile widziana.
Mój prosty plik 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 )
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.
Źródło: cmake.org/cmake/help/latest/command/if.htmlBiorąc pod uwagę, że jest to tak powszechny problem, wysyłanie geronto:
Dokumentacja logiki boolowskiej CMake
Nazwy platform CMake itp.
źródło
APPLE
.(UNIX AND NOT APPLE)
... a link @mlvljr zmienił się na: gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/ ... teraz.Ogólnie
Możesz wykryć i określić zmienne dla kilku systemów operacyjnych, takich jak ten:
Wykryj Microsoft Windows
Lub:
Wykryj Apple MacOS
Wykryj Unix i Linux
Twój konkretny problem z łącznikiem
Aby rozwiązać problem z
wsock32
biblioteką specyficzną dla systemu Windows , po prostu usuń ją z innych systemów, na przykład:źródło
Masz kilka specjalnych słów od CMAKE, spójrz:
źródło
STREQUAL
akceptuje zmienne (oprócz ciągu znaków) jako pierwszy operand, więc może być bardziej zwięzłyif(CMAKE_SYSTEM_NAME STREQUAL "Linux")...
Możliwe są również wyrażenia generatora:
Spowoduje to połączenie libA, wsock32 i libC w systemie Windows oraz połączenie libA, libB i libC w systemie Linux
Wyrażenia generatora CMake
źródło
Spróbuj tego:
Możesz znaleźć inne przydatne zmienne tutaj .
źródło
Chcę to tutaj zostawić, ponieważ zmagałem się z tym podczas kompilacji dla Androida w systemie Windows z Android SDK.
CMake rozróżnia platformy TARGET i HOST.
Moim celem był Android, więc zmienne takie jak CMAKE_SYSTEM_NAME miały wartość „Android”, a zmienna WIN32 z drugiej odpowiedzi nie została zdefiniowana. Ale chciałem wiedzieć, czy moim systemem HOST jest Windows, ponieważ musiałem zrobić kilka rzeczy inaczej podczas kompilacji w systemie Windows, Linux lub IO. Aby to zrobić, użyłem CMAKE_HOST_SYSTEM_NAME, który, jak znalazłem, jest ledwo znany lub nigdzie wspomniany, ponieważ dla większości ludzi TARGEt i HOST są takie same lub ich to nie obchodzi.
Mam nadzieję, że to pomoże komuś gdzieś ...
źródło
Użyj makra preprocesora, aby sprawdzić, czy jest w systemie Windows lub Linux. Na przykład
włącz -l $ (LIB) do polecenia budowania.
Możesz także określić argument wiersza poleceń, aby rozróżnić oba.
źródło