Ich bin ein Anfänger von CMAKE. Unten finden Sie eine einfache cmake-Datei, die in Fenstern der Mingw-Umgebung gut funktioniert. Das Problem liegt eindeutig in der target_link_libraries()
Funktion von CMAKE, wo ich libwsock32.a verknüpfe. In Windows funktioniert das und ich bekomme die Ergebnisse.
Unter Linux /usr/bin/ld
wird jedoch erwartungsgemäß nach dem gesucht, -lwsock32
was unter Linux NICHT vorhanden ist.
Mein Problem ist: Wie weise ich CMAKE an, 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 )
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.
Quelle: cmake.org/cmake/help/latest/command/if.htmlAngesichts dessen, dass dies ein so häufiges Problem ist, wird geronto-posting:
CMake boolesche Logikdokumente
CMake-Plattformnamen usw.
quelle
APPLE
.(UNIX AND NOT APPLE)
... und der Link von @mlvljr wurde geändert in: gitlab.kitware.com/cmake/community/-/wikis/doc/tutorials/… jetzt.Allgemein
Sie können Variablen für verschiedene Betriebssysteme wie folgt erkennen und angeben:
Erkennen Sie Microsoft Windows
Oder:
Apple MacOS erkennen
Erkennen Sie Unix und Linux
Ihr spezifisches Linker-Problem
Um Ihr Problem mit der Windows-spezifischen
wsock32
Bibliothek zu lösen , entfernen Sie sie einfach von anderen Systemen:quelle
Sie haben einige spezielle Wörter von CMAKE, werfen Sie einen Blick darauf:
quelle
STREQUAL
akzeptiert Variablen (zusätzlich zum String) als ersten Operanden, daher könnte es prägnanter seinif(CMAKE_SYSTEM_NAME STREQUAL "Linux")...
Generatorausdrücke sind ebenfalls möglich:
Dadurch werden libA, wsock32 und libC unter Windows und libA, libB und libC unter Linux verknüpft
CMake Generator-Ausdrücke
quelle
Versuch das:
Weitere nützliche Variablen finden Sie hier .
quelle
Ich möchte dies hier belassen, weil ich beim Kompilieren für Android in Windows mit dem Android SDK damit zu kämpfen hatte.
CMake unterscheidet zwischen TARGET- und HOST-Plattform.
Mein ZIEL war Android, daher hatten Variablen wie CMAKE_SYSTEM_NAME den Wert "Android" und die Variable WIN32 aus der anderen Antwort hier wurde nicht definiert. Aber ich wollte wissen, ob mein HOST-System Windows ist, weil ich beim Kompilieren unter Windows, Linux oder E / A einige Dinge anders machen musste. Zu diesem Zweck habe ich CMAKE_HOST_SYSTEM_NAME verwendet, von dem ich festgestellt habe, dass es kaum bekannt ist oder irgendwo erwähnt wird, da TARGEt und HOST für die meisten Menschen gleich sind oder es ihnen egal ist.
Hoffe das hilft jemandem irgendwo ...
quelle
Verwenden Sie ein Präprozessor-Makro, um zu überprüfen, ob es sich um Windows oder Linux handelt. Beispielsweise
Fügen Sie -l $ (LIB) in Ihren Build-Befehl ein.
Sie können auch ein Befehlszeilenargument angeben, um beide zu unterscheiden.
quelle