私は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 )
つかいます
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 を参照
これは非常に一般的な問題であるため、ジェロント投稿:
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()
次のようないくつかのオペレーティングシステムの変数を検出および指定できます。
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()
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})
他の有用な変数 here を見つけることができます。