web-dev-qa-db-ja.com

CMAKEのOS固有の指示:方法

私はCMAKEの初心者です。以下は、mingw環境ウィンドウでうまく機能する単純なcmakeファイルです。問題は明らかに、私がlibwsock32.aをリンクしているCMAKEのtarget_link_libraries()関数にあります。 Windowsではこれが機能し、結果が得られます。

ただし、予想どおり、Linuxでは、/usr/bin/ldはLinux OSにはない-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 )
66
Prasad

つかいます

if (WIN32)
    #do something
endif (WIN32)

または

if (UNIX)
    #do something
endif (UNIX)

または

if (MSVC)
    #do something
endif (MSVC)

または類似

CMake Use Variable Variables および CMake Checking Platform を参照

99
relaxxx

これは非常に一般的な問題であるため、ジェロント投稿:

    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

CMakeプラットフォーム名など

53
mlvljr

一般に

次のようないくつかのオペレーティングシステムの変数を検出および指定できます。

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()
38
Waqar Lim

CMAKEからの特別な言葉があります。ご覧ください。

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

ジェネレーター式も可能です。

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をリンクします

CMake Generator Expressions

6
Cascades

それを試してください:

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

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

他の有用な変数 here を見つけることができます。

5
tibur