সিএমএকেইতে ওএসের নির্দিষ্ট নির্দেশাবলী: কীভাবে?


115

আমি CMAKE এর একটি শিক্ষানবিস। নীচে একটি সাধারণ cmake ফাইল যা মিং ওয়াট এনভায়রনমেন্ট উইন্ডোতে ভাল কাজ করে। সমস্যাটি স্পষ্টভাবে target_link_libraries()CMAKE এর ফাংশনের সাথে যেখানে আমি libwsock32.a লিঙ্ক করছি। উইন্ডোতে এটি কাজ করে এবং আমি ফলাফলগুলি পাই।

তবে, যেমনটি প্রত্যাশা করা হয়েছে, লিনাক্সে, লিনাক্স ওএসে নেই যা /usr/bin/ldঅনুসন্ধান করবে -lwsock32

আমার সমস্যা হ'ল লিনাক্স ওএসে ডাব্লু এসক 32 লাইব্রেরিটি লিঙ্ক এড়াতে আমি 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 )

উত্তর:


154

ব্যবহার

if (WIN32)
    #do something
endif (WIN32)

বা

if (UNIX)
    #do something
endif (UNIX)

বা

if (MSVC)
    #do something
endif (MSVC)

অথবা অনুরুপ

দেখতে CMake দরকারী ভেরিয়েবল এবং CMake চেক প্ল্যাটফর্ম


সোলারিসের জন্য একটি কী ব্যবহার করে?
jww

হুঁ, লিঙ্ক-এ থাকা পৃষ্ঠাগুলি সহায়ক তবে WIN32 বা UNIX এর কোনওটিই উল্লেখ করে না। অন্য কোন / অনুরূপ সংস্থান যে পারে?
rchilton1980

4
আহ, এটি খুঁজে পেয়েছি। এটি ইউনিক্স, ডাব্লুআইএন 32
rchilton1980

4
@ rchilton1980: পৃষ্ঠা সরানো হয়েছে, নতুন লিঙ্ক: gitlab.kitware.com/cmake/commune/wikis/doc/cmake/…
schnaader

অন্য কারও জন্য ভাবছেন: Per legacy, the else() and endif() commands admit an optional <condition> argument. If used, it must be a verbatim repeat of the argument of the opening if command.উত্স: cmake.org/cmake/help/latest/command/if.html
জাইল

76

এটি যেমন একটি সাধারণ সমস্যা, জেরোনটো পোস্টিং দেওয়া হয়েছে:

    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()

বুলিয়ান লজিক ডক্স সিএমকে নিন

সিএমকে প্ল্যাটফর্মের নাম ইত্যাদি etc.


9
উল্লেখ করার জন্য ধন্যবাদ APPLE
ভিক্টর সার্জিয়েনকো

@ ভিক্টর সার্জিয়েনকো Всегда рад помочь :)
mlvljr

4
অনুমান করবেন না ইউনিক্স হল লিনাক্স। সিএমকে_সিস্টেম_নামের জন্য ব্যবহারযোগ্য ভেরিয়েবল ওয়েবসাইটের লিঙ্ক। লিনাক্স মিক্সড কেস ওএস ডিটেক্টর ব্যবহার করুন
উজ্জ্বল করুন

টিবুরের উত্তর আরও ভাল
উজ্জ্বল করুন

4
হ্যাঁ, ফ্রিবিএসডি এছাড়াও পাস করবে (UNIX AND NOT APPLE)... এবং @ এমএলভিএলজেআর'র লিঙ্কটি এখন পরিবর্তিত হয়েছে: gitlab.kitware.com/cmake/commune/-/wikis/doc/tutorials/… এখন।
স্লিএসভেন

48

সাধারণভাবে

আপনি এর মতো বেশ কয়েকটি অপারেটিং সিস্টেমের জন্য ভেরিয়েবলগুলি সনাক্ত এবং নির্দিষ্ট করতে পারেন:

মাইক্রোসফ্ট উইন্ডোজ সনাক্ত করুন

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গ্রন্থাগার দিয়ে আপনার সমস্যা সমাধানের জন্য , কেবল এটির মতো অন্যান্য সিস্টেম থেকে সরিয়ে ফেলুন:

if(WIN32)
    target_link_libraries(${PROJECT_NAME} bioutils wsock32)
else
    target_link_libraries(${PROJECT_NAME} bioutils)
endif()

4
সোলারিসের জন্য একটি কী ব্যবহার করে?
jww

4
টাইপো: এমএসভিএস এমএসভিসি হওয়া উচিত। আমি এটি আপনার জন্য সম্পাদনা করার চেষ্টা করেছি কিন্তু
স্ট্যাকওভারফ্লো

4
ডকুমেন্টেশন অনুসারে, "অ্যাপল" কেবলমাত্র বোঝায় যে আমরা একটি আপেল লক্ষ্য তৈরি করছি; অর্থাত্ ওএসএক্স, তবে আইওএস, ওয়াচওএস ইত্যাদিও কোনও নির্ভরযোগ্য পদ্ধতিতে ওএস এক্স সনাক্ত করার কোনও উপায় আছে?

জুলিয়েন আপনি যদি আইওএস, টিভিএস বা ওয়াচওএসের জন্য তৈরি করে থাকেন তবে আপনি সম্ভবত একটি ক্যামেক টুলচেন ফাইল ব্যবহার করছেন, যা সেখানে কিছু ধরণের পরিবর্তনশীল সেট থাকা উচিত যা আপনি যা খুঁজছেন তা অর্জন করতে ব্যবহার করা যেতে পারে।
মিচিয়সন

@ জুলিয়েন এফডাব্লুআইডাব্লু: ক্যামেকের ডকুমেন্টেশনগুলি কেবলমাত্র এতে নিশ্চিত করে যে এতে আইওএস, ওয়াচওএস, টিভিএস অন্তর্ভুক্ত রয়েছে ৩.১০.৩.২০১ax
১১-১১ এ ম্যাক্সেন্স

19

আপনার CMAKE এর কিছু বিশেষ শব্দ রয়েছে, একবার দেখুন:

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

4
স্ট্যান্ডার্ড সিএমকে উপায়: অভ্যন্তরীণভাবে বেমানান :) [এটি একটি ডান /
প্রতিদ্বন্দ্বী

সেই অনুসন্ধানের জন্য, এখানে নাম তালিকা github.com/Kitware/CMake/blob/master/Modules/...
যেমন AT

STREQUALভেরিয়েবলগুলি (স্ট্রিং ছাড়াও) প্রথম অপারেন্ড হিসাবে স্বীকার করে, তাই এটি আরও সংক্ষিপ্ত হতে পারেif(CMAKE_SYSTEM_NAME STREQUAL "Linux")...
অ্যাড এন

13

জেনারেটর এক্সপ্রেশন এছাড়াও সম্ভব:

target_link_libraries(
    target_name
    PUBLIC
        libA
        $<$<PLATFORM_ID:Windows>:wsock32>
    PRIVATE
        $<$<PLATFORM_ID:Linux>:libB>
        libC
)

এটি উইন্ডোতে libA, wsock32 & libC এবং লিঙ্কে libA, libB এবং libC লিঙ্ক করবে

সিএমকে জেনারেটর এক্সপ্রেশন


এর জন্য ধন্যবাদ আপনি কেবল ">" অতিরিক্ত যুক্ত করেছেন। যা "$ <$ <PLATFORM_ID: উইন্ডোজ>: wsock32>"
wow2006

6

চেষ্টা কর:

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

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

আপনি এখানে অন্যান্য দরকারী ভেরিয়েবলগুলি খুঁজে পেতে পারেন ।


এটি কাজ করেছে এবং আমি ব্যক্তিগতভাবে এটি খুব স্বজ্ঞাত হিসাবে পছন্দ করি। আপনাকে অনেক ধন্যবাদ.
প্রসাদ

2

আমি এটি এখানেই রাখতে চাই কারণ অ্যান্ড্রয়েড এসডিকে উইন্ডোজে অ্যান্ড্রয়েডের জন্য সংকলন করার সময় আমি এটির সাথে লড়াই করেছি।

সিএমকে TARGET এবং HOST প্ল্যাটফর্মের মধ্যে পার্থক্য করে।

আমার TARGET অ্যান্ড্রয়েড তাই CMAKE_SYSTEM_NAME এর মত ভেরিয়েবলগুলির "Android" মান ছিল এবং অন্য উত্তর থেকে ভেরিয়েবল WIN32 সংজ্ঞায়িত হয়নি। তবে আমি জানতে চেয়েছিলাম যে আমার HOST সিস্টেমটি উইন্ডোজ কিনা কারণ উইন্ডোজ বা লিনাক্স বা আইওএস উভয়কে সংকলন করার সময় আমার কয়েকটি জিনিস আলাদাভাবে করা দরকার ছিল। এটি করার জন্য আমি CMAKE_HOST_SYSTEM_NAME ব্যবহার করেছি যা সবেমাত্র পরিচিত বা কোথাও উল্লেখ করা হয়েছে কারণ বেশিরভাগ লোকের জন্য TARGEt এবং HOST একই বা তাদের যত্ন নেই।

আশা করি এটি কোথাও কাউকে সহায়তা করবে ...


-5

এটি উইন্ডো বা লিনাক্সে আছে কিনা তা পরীক্ষা করতে কিছু প্রিপ্রোসেসর ম্যাক্রো ব্যবহার করুন। উদাহরণ স্বরূপ

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

আপনার বিল্ড কমান্ডের মধ্যে -l $ (LIB) অন্তর্ভুক্ত করুন।

উভয়কে আলাদা করতে আপনি কিছু কমান্ড লাইন যুক্তিও নির্দিষ্ট করতে পারেন।


6
ব্যবহারকারী সিএমকে মেকফিলগুলি চাইছেন।
টিবুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.