CMAKE의 초보자입니다. 아래는 mingw 환경 창에서 잘 작동하는 간단한 cmake 파일입니다. 문제는 target_link_libraries()
내가 libwsock32.a를 연결하는 CMAKE의 기능에 분명히 있습니다. Windows에서 이것은 작동하고 결과를 얻습니다.
그러나 예상대로 Linux에서는 Linux OS에없는 것을 /usr/bin/ld
찾습니다 -lwsock32
.
내 문제는 : Linux OS에서 wsock32 라이브러리를 연결하지 않도록 CMAKE에 어떻게 지시합니까 ???
어떤 도움이라도 대단히 감사하겠습니다.
내 간단한 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)
또는 유사
참조 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 관련 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
답변
생성기 표현식도 가능합니다.
target_link_libraries(
target_name
PUBLIC
libA
$<$<PLATFORM_ID:Windows>:wsock32>
PRIVATE
$<$<PLATFORM_ID:Linux>:libB>
libC
)
그러면 Windows에서는 libA, wsock32 및 libC가 연결되고 Linux에서는 libA, libB 및 libC가 연결됩니다.
답변
시도해보십시오.
if(WIN32)
set(ADDITIONAL_LIBRARIES wsock32)
else()
set(ADDITIONAL_LIBRARIES "")
endif()
target_link_libraries(${PROJECT_NAME} bioutils ${ADDITIONAL_LIBRARIES})
여기에서 다른 유용한 변수를 찾을 수 있습니다 .
답변
Android SDK를 사용하여 Windows에서 Android 용으로 컴파일 할 때 어려움을 겪었으므로 여기에 남겨두고 싶습니다.
CMake는 TARGET과 HOST 플랫폼을 구분합니다.
내 TARGET은 Android 였으므로 CMAKE_SYSTEM_NAME과 같은 변수의 값은 “Android”이고 다른 답변의 변수 WIN32는 정의되지 않았습니다. 하지만 Windows, Linux 또는 IO에서 컴파일 할 때 몇 가지 다른 작업을 수행해야했기 때문에 HOST 시스템이 Windows인지 알고 싶었습니다. 그렇게하기 위해 CMAKE_HOST_SYSTEM_NAME을 사용했습니다. 대부분의 사람들에게 TARGEt와 HOST는 동일하거나 상관하지 않기 때문에 거의 알려지지 않았거나 어디에서나 언급되었습니다.
이것이 누군가 어딘가에 도움이되기를 바랍니다 …