CMake l'ajout de bibliothèques pour Windows/Linux
Visual Studio C++ 2008 /GCC 4.4.2
J'ai écrit un programme pour fonctionner sur Linux et maintenant, j'ai de port mon code à exécuter sur Windows. J'ai décidé d'utiliser CMake que je veux garder le même système de construction pour les deux plates-formes.
Cependant, j'ai besoin de faire un lien avec certaines bibliothèques pour les deux plates-formes. Dans mon CMakeLists.txt j'ai le texte suivant:
# Compile with gcc c89 standard
IF(CMAKE_COMPILER_IS_GNUCXX)
MESSAGE(STATUS "GCC detected - Adding compiler flags")
SET(CMAKE_C_FLAGS "-pthread -ggdb -Wextra -Wall -pedantic -std=c89")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
IF(WIN32)
SET(CMAKE_C_FLAGS "ws2_32.lib")
ENDIF(WIN32)
Cependant, quand je compile sur Visual Studio, j'obtiens l'erreur suivante:
fatal error C1083: Cannot open source file: 'ws2_32.lib': No such file or directory
Que puis-je faire pour résoudre ce problème?
========= Modifier
Dans le répertoire de niveau supérieur
# Project Client Server
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
# Name of project
PROJECT(CLIENT_SERVER)
# Compile with gcc c89 standard
IF(CMAKE_COMPILER_IS_GNUCXX)
MESSAGE(STATUS "GCC detected - Adding compiler flags")
SET(CMAKE_C_FLAGS "-pthread -ggdb -Wextra -Wall -pedantic -std=c89")
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
IF(WIN32)
SET(CMAKE_C_FLAGS "ws2_32")
ENDIF(WIN32)
# Includes
INCLUDE_DIRECTORIES(${CLIENT_SERVER_SOURCE_DIR}/cltsvr_ults)
INCLUDE_DIRECTORIES(${CLIENT_SERVER_SOURCE_DIR}/server)
INCLUDE_DIRECTORIES(${CLIENT_SERVER_SOURCE_DIR}/client)
# libraries
LINK_DIRECTORIES($CLIENT_SERVER/cltsvr_ults)
# Add subdirectories
ADD_SUBDIRECTORY(client)
ADD_SUBDIRECTORY(server)
ADD_SUBDIRECTORY(cltsvr_ults)
ADD_SUBDIRECTORY(test_client)
ADD_SUBDIRECTORY(test_server)
Dans le sous-répertoire de client, j'ai ceci CMakeLists.txt
# libray called client from client.c
ADD_LIBRARY(client client)
Et dans le sous-répertoire de test_clt où je créer et établir un lien de mon exécutable.
# Test client add executable
INCLUDE_DIRECTORIES($CLIENT_SERVER_SOURCE_DIR/client)
INCLUDE_DIRECTORIES($CLIENT_SERVER_SOURCE_DIR/cltsvr_ults)
# Link the library
LINK_DIRECTORIES($CLIENT_SERVER/client)
# Add the executable
ADD_EXECUTABLE(clt test_clt)
# Link the executable to the client library
IF(WIN32)
TARGET_LINK_LIBRARIES(clt client ws2_32)
ENDIF(WIN32)
J'utilise CMake 2.8.0
supprimer: SI(WIN32) SET(CMAKE_C_FLAGS "ws2_32") ENDIF(WIN32)
Oui, cela a fonctionné. Merci.
Ce serait sympa de vous, alors, de donner ma réponse ci-dessous un +1, donc s'éloigne de -1.
OriginalL'auteur ant2009 | 2010-02-27
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser le Cible Bibliothèques De Liens de commande. La cible serait le fichier exécutable que vous êtes en train de construire.
EDIT: Vous ne spécifiez pas les libs vous êtes reliant contre dans C_FLAGS. Vous pouvez faire quelque chose comme TARGET_LINK_LIBRARIES(execName, ws_32, ...). Je ne suis pas sûr à 100% si vous avez besoin de la .lib. Été un moment depuis que j'ai utilisé CMake.
OriginalL'auteur NG.
Avertissement: Ma réponse est de nature philosophique qui devrait vous encourager à éviter de toucher CMAKE_C_FLAGS directement. Pour la réponse directe qui vient de résoudre votre problème de regarder ce que le projet de Loi ( l'architecte en chef de l'CMake btw. ) a écrit.
La chose à propos de CMake, c'est qu'elle permet de décrire ce que vous voulez faire sans référence à un compilateur ou la plate-forme. Ce CMake n'est bâtiment de le compilateur et l'éditeur de liens drapeaux de votre utilisation de
Si il n'y a pas de dépendances externes, autres que le compilateur lui-même, c'est tout ce dont vous avez besoin. Pour les dépendances externes utilisation
find_package
Il définit un ensemble de variables, comme
définit
pour une utilisation avec respectivement include_directories et target_link_libraries. CMake est livré avec un tas de soi-disant module de fichiers, comme les FindSDL.cmake et beaucoup d'autres peuvent être trouvées sur google.
Le niveau inférieur suivant est d'utiliser
qui sont utilisés dans le Trouver???.cmake modules de lui-même.
La CMAKE_C_FLAGS variable est composée par CMake à partir de ces commandes. Modifier cela signifie que vous contournement de CMake. Il y a des cas, comme pour d'optimisation particulière drapeaux, vous voulez faire cela, mais à ce point, tout le pouvoir et donc la responsabilité transférée de CMake pour vous.
J'ai incrémenté de votre réponse.
Quelles recommandations faites-vous quand vous avez les drapeaux de compilation qui varie selon la plate-forme, mais ne sont pas le résultat de la bibliothèque différences? Par exemple, quand je compile pour mingw, -fPIC ne semble pas être nécessaire...
Je suppose que ce que vous entendez est la compilation de la construction d'une bibliothèque statique, qui est plus tard pour être lié à une autre, commune, droit? x86_32 Windows et Linux n'a pas besoin de l'-fPIC, mais le x86_64 versions ne.
En général, il y a un certain nombre de couches, où les niveaux inférieurs ont la primauté sur les plus élevées. Les plus bas (à ma connaissance) est la source du fichier des indicateurs spécifiques, mais je n'ai jamais utilisé ça. Ce que je n'utilisez-vous fréquemment est le réglage de l'objectif des indicateurs spécifiques. C'est fait via SET_TARGET_PROPERTIES où vous pouvez définir les COMPILE_FLAGS et/ou LINK_FLAGS propriétés. C'est aussi le bon endroit pour ajouter un -fPIC à une bibliothèque statique, lorsque vous souhaitez par la suite un lien dans une bibliothèque partagée.
OriginalL'auteur Maik Beckmann
En ajoutant ws2_32.lib à la C_FLAGS, vous utilisez au moment de la compilation, et non de la liaison. Si vous regardez le message d'erreur, vous pouvez le voir il traiter le fichier comme s'il s'agissait d'un fichier source c++: Impossible d'ouvrir le fichier source: la " ws2_32.lib'. target_link_libraries(cible ws2_32).
OriginalL'auteur Bill Hoffman