Инструкции для ОС в CMAKE: как? - PullRequest
63 голосов
/ 06 февраля 2012

Я новичок в CMAKE. Ниже приведен простой файл cmake, который хорошо работает в окнах среды mingw. Проблема явно в target_link_libraries() функции CMAKE, где я ссылаюсь на libwsock32.a. В Windows это работает, и я получаю результаты.

Однако, как и ожидалось, в Linux /usr/bin/ld будет искать -lwsock32, которого нет в ОС Linux.

Моя проблема: Как я могу дать CMAKE команду избегать связывания библиотеки wsock32 в ОС Linux ???

Любая помощь будет принята с благодарностью.

Файл My 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 )

Ответы [ 7 ]

93 голосов
/ 06 февраля 2012

Используйте

if (WIN32)
    #do something
endif (WIN32)

или

if (UNIX)
    #do something
endif (UNIX)

или

if (MSVC)
    #do something
endif (MSVC)

или аналогичный

см. CMake Полезные переменные и Платформа для проверки CMake

51 голосов
/ 27 августа 2015

Учитывая, что это такая распространенная проблема, 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()

CMake булевские логические документы

CMake названия платформ и т. Д.

37 голосов
/ 20 октября 2016

В целом

Вы можете обнаружить и указать переменные для нескольких операционных систем, например:

Обнаружение Microsoft Windows

if(WIN32)
    # for Windows operating system in general
endif()

Или:

if(MSVC OR MSYS OR MINGW)
    # for detecting Windows compilers
endif()

Обнаружение Apple MacOS

if(APPLE)
    # for MacOS X or iOS, watchOS, tvOS (since 3.10.3)
endif()

Обнаружение Unix и Linux

if(UNIX AND NOT APPLE)
    # for Linux, BSD, Solaris, Minix
endif()

Ваша проблема с компоновщиком

Чтобы решить проблему с библиотекой wsock32 для Windows, просто удалите ее из других систем, например:

if(WIN32)
    target_link_libraries(${PROJECT_NAME} bioutils wsock32)
else
    target_link_libraries(${PROJECT_NAME} bioutils)
endif()
12 голосов
/ 06 февраля 2012

У вас есть несколько специальных слов из CMAKE, посмотрите:

if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
    // do something for Linux
else
    // do something for other OS
5 голосов
/ 31 января 2019

Выражения генератора также возможны:

target_link_libraries(
    target_name
    PUBLIC
        libA
        $<$<PLATFORM_ID:Windows>:wsock32>
    PRIVATE
        $<$<PLATFORM_ID:Linux>:libB>
        libC
)

Это будет связывать libA, wsock32 и libC в Windows и связывать libA, libB & libC в Linux

Выражения генератора CMake

5 голосов
/ 06 февраля 2012

Попробуйте это:

if(WIN32)
    set(ADDITIONAL_LIBRARIES wsock32)
else()
    set(ADDITIONAL_LIBRARIES "")
endif()

target_link_libraries(${PROJECT_NAME} bioutils ${ADDITIONAL_LIBRARIES})

Вы можете найти другие полезные переменные здесь .

0 голосов
/ 06 февраля 2012

Используйте некоторый макрос препроцессора, чтобы проверить, находится ли он в Windows или Linux.Например,

#ifdef WIN32
LIB= 
#elif __GNUC__
LIB=wsock32
#endif

включает -l $ (LIB) в команду построения.

Вы также можете указать некоторый аргумент командной строки, чтобы различать оба.

...