Saya seorang pemula CMAKE. Di bawah ini adalah file cmake sederhana yang berfungsi dengan baik di jendela lingkungan mingw. Masalahnya jelas dengan target_link_libraries()
fungsi CMAKE di mana saya menghubungkan libwsock32.a. Di jendela ini berfungsi dan saya mendapatkan hasilnya.
Namun, seperti yang diharapkan, di Linux, /usr/bin/ld
pencarian -lwsock32
yang TIDAK ada di OS Linux.
Masalah saya adalah: Bagaimana cara menginstruksikan CMAKE untuk menghindari menautkan pustaka wsock32 di OS Linux ???
Bantuan apa pun akan sangat dihargai.
File CMake Sederhana saya:
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 )
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.
Sumber: cmake.org/cmake/help/latest/command/if.htmlMengingat ini adalah masalah yang umum, geronto-posting:
Dokumentasi logika boolean CMake
Nama platform CMake, dll.
sumber
APPLE
.(UNIX AND NOT APPLE)
... dan tautan @mlvljr telah berubah menjadi: gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/… sekarang.Secara umum
Anda dapat mendeteksi dan menentukan variabel untuk beberapa sistem operasi seperti itu:
Deteksi Microsoft Windows
Atau:
Deteksi Apple MacOS
Deteksi Unix dan Linux
Masalah linker spesifik Anda
Untuk mengatasi masalah Anda dengan
wsock32
pustaka khusus Windows , hapus saja dari sistem lain, seperti itu:sumber
Anda memiliki beberapa kata khusus dari CMAKE, lihat:
sumber
STREQUAL
menerima variabel (selain string) sebagai operan pertama, jadi bisa lebih ringkasif(CMAKE_SYSTEM_NAME STREQUAL "Linux")...
Ekspresi generator juga dimungkinkan:
Ini akan menautkan libA, wsock32 & libC di Windows dan menautkan libA, libB & libC di Linux
Ekspresi Generator CMake
sumber
Coba itu:
Anda dapat menemukan variabel berguna lainnya di sini .
sumber
Saya ingin meninggalkan ini di sini karena saya kesulitan dengan ini ketika menyusun untuk Android di Windows dengan Android SDK.
CMake membedakan antara platform TARGET dan HOST.
TARGET saya adalah Android jadi variabel seperti CMAKE_SYSTEM_NAME memiliki nilai "Android" dan variabel WIN32 dari jawaban lain di sini tidak ditentukan. Tetapi saya ingin tahu apakah sistem HOST saya adalah Windows karena saya perlu melakukan beberapa hal secara berbeda saat mengompilasi pada Windows atau Linux atau IOs. Untuk melakukan itu saya menggunakan CMAKE_HOST_SYSTEM_NAME yang saya temukan hampir tidak dikenal atau disebutkan di mana saja karena bagi kebanyakan orang TARGEt dan HOST sama atau mereka tidak peduli.
Semoga ini bisa membantu seseorang di suatu tempat ...
sumber
Gunakan beberapa makro preprocessor untuk memeriksa apakah itu ada di windows atau linux. Sebagai contoh
sertakan -l $ (LIB) di perintah build Anda.
Anda juga dapat menentukan beberapa argumen baris perintah untuk membedakan keduanya.
sumber