CMAKE의 OS 별 지침 : 방법?
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})
여기에서 다른 유용한 변수를 찾을 수 있습니다 .
일부 전 처리기 매크로를 사용하여 Windows 또는 Linux에 있는지 확인하십시오. 예를 들면
#ifdef WIN32
LIB=
#elif __GNUC__
LIB=wsock32
#endif
빌드 명령에 -l $ (LIB)를 포함하십시오.
둘 다 구별하기 위해 몇 가지 명령 줄 인수를 지정할 수도 있습니다.
참고URL : https://stackoverflow.com/questions/9160335/os-specific-instructions-in-cmake-how-to
'programing' 카테고리의 다른 글
dotnet.exe 프로세스를 시작할 수 없습니다. (0) | 2020.11.06 |
---|---|
Django 로컬 설정 (0) | 2020.11.06 |
Eclipse-Android 장치 선택기에서 "알 수 없음"대상 (0) | 2020.11.06 |
숫자 'n'으로 나눌 수있는 바이너리 문자열을 허용하는 DFA 설계 (0) | 2020.11.06 |
Gradle을 사용하여 jar에 리소스, 구성 파일 추가 (0) | 2020.11.06 |