Я новичок в CMAKE. Ниже приведен простой файл cmake, который хорошо работает в окнах среды mingw. Проблема явно target_link_libraries()
связана с функцией CMAKE, где я связываю libwsock32.a. В Windows это работает, и я получаю результаты.
Однако, как и ожидалось, в Linux /usr/bin/ld
будет искать то, -lwsock32
чего НЕТ в ОС Linux.
Моя проблема: как мне проинструктировать CMAKE избегать связывания библиотеки wsock32 в ОС Linux ???
Любая помощь будет оценена.
Мой простой файл 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.
Источник: cmake.org/cmake/help/latest/command/if.htmlУчитывая, что это такая распространенная проблема, geronto-posting:
Документы по логической логике CMake
Названия платформ CMake и т. Д.
источник
APPLE
.(UNIX AND NOT APPLE)
... и ссылка @mlvljr изменилась на: gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/ ... сейчас.В основном
Вы можете определять и указывать переменные для нескольких таких операционных систем:
Обнаружить Microsoft Windows
Или:
Обнаружить Apple MacOS
Обнаружение Unix и Linux
Ваша конкретная проблема с линкером
Чтобы решить проблему с
wsock32
библиотекой для Windows , просто удалите ее из других систем, например:источник
У вас есть особые слова из CMAKE, взгляните:
источник
STREQUAL
принимает переменные (в дополнение к строке) в качестве первого операнда, поэтому он может быть более краткимif(CMAKE_SYSTEM_NAME STREQUAL "Linux")...
Также возможны выражения генератора:
Это свяжет libA, wsock32 и libC в Windows и свяжет libA, libB и libC в Linux.
Выражения генератора CMake
источник
Попробуй это:
Вы можете найти другие полезные переменные здесь .
источник
Я хочу оставить это здесь, потому что я боролся с этим при компиляции для Android в Windows с Android SDK.
CMake различает платформу TARGET и HOST.
Моим TARGET был Android, поэтому такие переменные, как CMAKE_SYSTEM_NAME, имели значение «Android», а переменная WIN32 из другого ответа здесь не была определена. Но я хотел знать, была ли моя HOST-система Windows, потому что мне нужно было сделать несколько вещей по-другому при компиляции на Windows, Linux или IO. Для этого я использовал CMAKE_HOST_SYSTEM_NAME, который, как я обнаружил, почти нигде не известен или упоминается, потому что для большинства людей TARGEt и HOST одинаковы или им все равно.
Надеюсь, это кому-то поможет ...
источник
Используйте какой-нибудь макрос препроцессора, чтобы проверить, находится ли он в Windows или Linux. Например
включить -l $ (LIB) в команду сборки.
Вы также можете указать аргумент командной строки, чтобы различать оба.
источник