Конкретные инструкции ОС в 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 ответов:
использовать
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()
В Общем
вы можете обнаружить и указать переменные для нескольких операционных систем так:
Обнаружение 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) в команду сборки.
вы также можете указать параметр командной строки, чтобы отличить обе.
Comments