Конкретные инструкции ОС в CMAKE: как это сделать?


Я новичок в CMAKE. Ниже представлен простой файл cmake, который хорошо работает в MinGW environment windows. Проблема явно с target_link_libraries() функция CMAKE, где я связываю libwsock32.а. В 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 )
6   51   2012-02-06 16:47:20

6 ответов:

использовать

if (WIN32)
    #do something
endif (WIN32)

или

if (UNIX)
    #do something
endif (UNIX)

или

if (MSVC)
    #do something
endif (MSVC)

или подобное

посмотреть CMake Полезные Переменные и CMake, Например, Проверяя Платформу

учитывая, что это такая распространенная проблема, 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 boolean logic docs

В Общем

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

Обнаружение 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()

ваша конкретная проблема компоновщика

чтобы решить вашу проблему с Windows-specific wsock32 библиотека, просто удалите ее из других систем, например:

if(WIN32)
    target_link_libraries(${PROJECT_NAME} bioutils wsock32)
else
    target_link_libraries(${PROJECT_NAME} bioutils)
endif()

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

if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
    // do something for Linux
else
    // do something for other OS

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

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

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

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

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

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

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

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