7
votes

Cumake Ajout de bibliothèques pour Windows / Linux

Visual Studio C ++ 2008 / GCC 4.4.2

J'ai écrit un programme pour exécuter sous Linux et je dois maintenant porter mon code pour exécuter des fenêtres. J'ai décidé d'utiliser CMAKE car je veux conserver le même système de construction pour les deux plates-formes. p>

Cependant, j'ai besoin de créer un lien avec certaines bibliothèques pour les deux plates-formes. Dans mes cmakelists.txt, j'ai ce qui suit: p> xxx pré>

Cependant, lorsque je compile sur Visual Studio, j'obtiens l'erreur suivante: p>

# 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)


2 commentaires

Supprimer: Si (Win32) SET (CUKE_C_FLAGS "WS2_32") endif (Win32)


Ce serait une sorte de vous alors, de donner ma réponse en dessous de +1, alors s'éloigne de -1.


3 Réponses :


6
votes

Vous devez utiliser le Bibliothèques de liaison cible commande. La cible serait l'exécutable que vous construisez.

EDIT: Vous ne devez pas spécifier les Libs que vous connaissez dans C_FLAGS. Vous pouvez faire quelque chose comme cible_link_libraries (Execname, WS_32, ...). Je ne suis pas sûr à 100% si vous avez besoin du .lib. Été un moment depuis que j'ai utilisé cmake.


0 commentaires

20
votes

Avertissement: Ma réponse est de nature philosophique qui devrait vous encourager à éviter CMAKE_C_FLAGS toucher directement. Pour la réponse directe qui vient de résoudre votre look problème ce projet de loi ( l'architecte principal de l'CMake btw. ) a écrit.

La seule chose sur CMake est qu'il vous permet de décrire ce que vous voulez faire sans se référer à un compilateur ou plate-forme spécifique. Qu'est-ce que CMake est fait construire les drapeaux du compilateur et l'éditeur de liens de votre utilisation de

  • include_directories
  • add_definitions
  • add_library
  • ADD_EXECUTABLE
  • TARGET_LINK_LIBRARIES

    S'il n'y a pas de dépendances externes, autres que le compilateur lui-même, cela est tout ce que vous avez besoin. Pour l'utilisation des dépendances externes find_package Il définit un ensemble de variables, comme

    • find_package (SDL)

      définit

      • SDL_INCLUDE_DIR
      • SDL_LIBRARY

        pour une utilisation avec respectivement include_directories et TARGET_LINK_LIBRARIES. navires CMake avec un groupe de soi-disant fichiers module, comme FindSDL.cmake et bien d'autres peuvent être googlé.

        Le niveau inférieur est d'utiliser

        • find_path
        • find_library

          qui sont utilisés dans la Recherche ???. Cmake modules lui-même.

          La variable CMAKE_C_FLAGS est constitué par CMake de ces commandes. Modification cela signifie que vous dérivation CMake. Il y a des cas, comme pour les drapeaux d'optimisation spéciaux, vous voulez faire cela, mais à ce point toute la puissance et donc la responsabilité de CMake transférée à vous.


4 commentaires

Ma réponse est-elle tellement inappropriée qu'elle mérite une note négative? Devrais-je le supprimer?


@AikBeckmann Que recommandez-vous lorsque vous avez des drapeaux de compilateur qui varient encore à la plate-forme ne sont pas le résultat de différences de bibliothèque? Par exemple, lorsque je compile pour Mingw, -fic ne semble pas être nécessaire ...


@DAVIN Je suppose que ce que vous voulez dire est de compiler construire une bibliothèque statique qui sera plus tard liée à un partagé, non? x86_32 Windows et Linux n'ont pas besoin de -fic, mais les versions X86_64 font.


@Davin En général, il existe un certain nombre de couches, où les niveaux inférieurs annulent les plus hautes. Le plus bas (AFAIK) est des drapeaux spécifiques de fichier source, mais je n'ai jamais utilisé cela. Ce que j'utilise, vous définissez fréquemment des drapeaux spécifiques cibles. C'est fait via Set_Target_Properties où vous pouvez définir les propriétés Compile_Flags et / ou Link_Flags. C'est également le bon endroit pour ajouter un -fic à une bibliothèque statique, lorsque vous souhaitez le lier dans une bibliothèque partagée.



11
votes

En ajoutant WS2_32.LIB au C_FLAGS, vous l'utilisez à l'heure de la compilation et non de liens. Si vous regardez le message d'erreur, vous pouvez le voir traiter le fichier comme s'il s'agissait d'un fichier source C ++: impossible d'ouvrir le fichier source: 'ws2_32.lib'. cible_link_libraries (cible WS2_32) devrait fonctionner.


1 commentaires

Je reçois toujours le même problème. J'ai édité ma question avec mes cmakelists complet.txt. Pouvez-vous voir quelque chose de mal.