CMAKEのOS固有の手順:どのように?

私はCMAKEの初心者です。以下は、mingw環境ウィンドウでうまく動作するシンプルなcmakeファイルです。この問題は、libwsock32.aをリンクしているCMAKEのtarget_link_libraries()関数ではっきりとわかります。ウィンドウズではこれが動作し、結果が得られます。

しかし、予想通り、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 )
46

6 答え

つかいます

if (WIN32)
    #do something
endif (WIN32)

または

if (UNIX)
    #do something
endif (UNIX)

または

if (MSVC)
    #do something
endif (MSVC)

または similar

see CMake つかいますful Variables

52
追加された
Solarisには何が使われていますか?
追加された 著者 jww,
ありがとう、それは働いた!
追加された 著者 Prasad,
ああ、これを見つけました。 UNIX、WIN32、おそらくすべての "同僚"に言及しています: cmake.org/Wiki/CMake_Checking_Platform
追加された 著者 rchilton1980,
リンク先のページは参考になりますが、WIN32またはUNIXは言及していません。他の/同様のリソースですか?
追加された 著者 rchilton1980,

これが一般的な問題であることを考えると、geronto-posted:

    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ブールロジックドキュメント

43
追加された
APPLE に感謝します。
追加された 著者 Victor Sergienko,
ティブルの答えがよかった
追加された 著者 don bright,
UNIXはLinuxであると仮定してはいけません。 cmake_system_nameのcmake有用変数ウェブサイトへのリンク。 Linuxの大文字と小文字を区別する
追加された 著者 don bright,
BSDで動作しません
追加された 著者 don bright,
@donbright right、それをどうやって修正しますか?
追加された 著者 mlvljr,
@donbrightあなたは答えとしてこれを投稿してください:)
追加された 著者 mlvljr,
@VictorSergienkoВсегдарадпомочь:)
追加された 著者 mlvljr,

一般に

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

Microsoft Windowsの検出

if(WIN32)
    # for Windows operating system 一般に
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()
29
追加された
Solarisには何が使われていますか?
追加された 著者 jww,
ありがとう、@ mchiasson - 私の答えを更新しました。
追加された 著者 Afri,
ドキュメンテーションによると、「APPLE」は、リンゴのターゲットを構築することを意味するだけです。つまりOSXだけでなく、iOS、watchOSなどもあります。OS Xを信頼できる方法で検出する方法はありますか?
追加された 著者 Julien,
Typo:MSVSはMSVCでなければなりません。私はあなたのためにそれを編集しようとしましたが、stackoverflowは何らかの理由で6文字未満の編集を許可していません...
追加された 著者 mchiasson,
@JulienあなたがiOS、tvOS、またはwatchOS用にビルドしている場合は、cmakeツールチェインファイルを使用する可能性が最も高いです。これは、そこに何らかの変数を設定する必要がありますあなたが探しているもの。
追加された 著者 mchiasson,
@Julien FWIW: cmakeのドキュメントでは、 3.10.3 以降、iOS、watchOS、tvOSも含まれています。
追加された 著者 itMaxence,

あなたはCMAKEからのいくつかの特別な言葉を持って、見て:

if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
   //do something for Linux
else
   //do something for other OS
6
追加された
標準的なCMakeの方法:内部的に一貫性がない :) [これは右から二番目の回答ですが]
追加された 著者 mlvljr,

それを試してください:

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

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

他の有用な変数はこちらにあります。

5
追加された
これは機能し、私は個人的には非常に直感的なので、これが好きです。どうもありがとうございました。
追加された 著者 Prasad,

いくつかのプリプロセッサマクロを使用して、WindowsまたはLinuxにあるかどうかを確認します。 例えば

#ifdef WIN32
LIB= 
#elif __GNUC__
LIB=wsock32
#endif

ビルドコマンドに-l $(LIB)をインクルードします。

両方を区別するために、いくつかのコマンドライン引数を指定することもできます。

3
追加された
ユーザーはCMakeメイクファイルを要求しています。
追加された 著者 tibur,