it-swarm.com.de

Betriebssystemspezifische Anweisungen in CMAKE: Vorgehensweise

Ich bin ein Anfänger in CMAKE. Unten finden Sie eine einfache cmake-Datei, die in Fenstern mit mingw-Umgebung gut funktioniert. Das Problem liegt eindeutig bei der Funktion target_link_libraries() von CMAKE, wo ich libwsock32.a verknüpfe. In Windows funktioniert das und ich bekomme die Ergebnisse.

Unter Linux ist das /usr/bin/ld sucht -lwsock32, das es unter Linux NICHT gibt.

Mein Problem ist: Wie kann ich CMAKE anweisen, das Verknüpfen der wsock32-Bibliothek unter Linux zu vermeiden?

Jede Hilfe wird sehr geschätzt.

Meine einfache CMake-Datei:

 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

Verwenden

if (WIN32)
    #do something
endif (WIN32)

oder

if (UNIX)
    #do something
endif (UNIX)

oder

if (MSVC)
    #do something
endif (MSVC)

o.ä

siehe CMake Useful Variables und CMake Checking Platform

99
relaxxx

In Anbetracht der Tatsache, dass dies ein so häufig auftretendes Problem ist, kann ein Posting wie folgt durchgeführt werden:

    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-Plattformnamen usw.

53
mlvljr

Im Allgemeinen

Sie können Variablen für mehrere Betriebssysteme wie das ermitteln und angeben:

Microsoft Windows erkennen

if(WIN32)
    # for Windows operating system in general
endif()

Oder:

if(MSVC OR MSYS OR MINGW)
    # for detecting Windows compilers
endif()

Erkennen Apple MacOS

if(Apple)
    # for MacOS X or iOS, watchOS, tvOS (since 3.10.3)
endif()

Erkennen Sie Unix und Linux

if(UNIX AND NOT Apple)
    # for Linux, BSD, Solaris, Minix
endif()

Ihr spezielles Linker-Problem

So lösen Sie Ihr Problem mit dem Windows-spezifischen wsock32 library, entferne es einfach von anderen Systemen, so:

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

Sie haben einige spezielle Wörter von CMAKE, werfen Sie einen Blick darauf:

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

Generatorausdrücke sind auch möglich:

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

Dies verbindet libA, wsock32 & libC unter Windows und libA, libB & libC unter Linux

CMake Generator Expressions

6
Cascades

Versuch das:

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

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

Sie können andere nützliche Variablen finden hier .

5
tibur