Ответ 1
Используйте
if (WIN32)
#do something
endif (WIN32)
или
if (UNIX)
#do something
endif (UNIX)
или
if (MSVC)
#do something
endif (MSVC)
или аналогичный
Я новичок в 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 )
Используйте
if (WIN32)
#do something
endif (WIN32)
или
if (UNIX)
#do something
endif (UNIX)
или
if (MSVC)
#do something
endif (MSVC)
или аналогичный
Учитывая, что это такая распространенная проблема, 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()
Вы можете обнаружить и указать переменные для нескольких операционных систем, например:
if(WIN32)
# for Windows operating system in general
endif()
Или же:
if(MSVC OR MSYS OR MINGW)
# for detecting Windows compilers
endif()
if(APPLE)
# for MacOS X or iOS, watchOS, tvOS (since 3.10.3)
endif()
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()
У вас есть специальные слова из CMAKE, посмотрите:
if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
// do something for Linux
else
// do something for other OS
Выражения генератора также возможны:
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
Попробуйте следующее:
if(WIN32)
set(ADDITIONAL_LIBRARIES wsock32)
else()
set(ADDITIONAL_LIBRARIES "")
endif()
target_link_libraries(${PROJECT_NAME} bioutils ${ADDITIONAL_LIBRARIES})
Здесь можно найти другие полезные переменные .
Я хочу оставить это здесь, потому что я боролся с этим при компиляции для 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. Например
#ifdef WIN32
LIB=
#elif __GNUC__
LIB=wsock32
#endif
включить -l $(LIB) в команду сборки.
Вы также можете указать некоторый аргумент командной строки, чтобы различать оба.