web-dev-qa-db-fra.com

Comment dire à CMake de se lier dans une bibliothèque statique dans le répertoire source?

J'ai un petit projet avec un Makefile que je tente de convertir en CMake, principalement pour acquérir de l'expérience avec CMake. Pour les besoins de cet exemple, le projet contient un fichier source (C++, bien que le langage ne soit pas particulièrement pertinent) et un fichier de bibliothèque statique que j'ai copié ailleurs. Supposons, par souci d'argument, que le code source de la bibliothèque n'est pas disponible; Je n'ai que le fichier .a et l'en-tête correspondant.

Mon Makefile fait main contient cette règle de construction:

main: main.o libbingitup.a
    g++ -o main main.o libbingitup.a

qui fonctionne bien. Comment puis-je dire à CMake de reproduire cela? Pas littéralement ce makefile exact, bien sûr, mais quelque chose qui inclut une commande de liaison équivalente. J'ai essayé les moyens évidents mais naïfs, comme

add_executable(main main.cpp libbingitup.a)

ou

add_executable(main main.cpp)
target_link_libraries(main libbingitup.a)

ainsi que diverses choses avec link_directories(.) ou add_library(bingitup STATIC IMPORTED) etc., mais rien jusqu'à présent ne permet de créer un lien efficace. Que devrais-je faire?


Détails de la version: CMake 2.8.7 sur Linux (Kubuntu 12.04) avec GCC 4.6.3

67
David Z

CMake préfère passer le chemin complet aux bibliothèques de liens, donc supposons que libbingitup.a soit dans ${CMAKE_SOURCE_DIR}, procédez comme suit pour réussir:

add_executable(main main.cpp)
target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a)
93
Fraser

Si vous ne voulez pas inclure le chemin complet, vous pouvez le faire

add_executable(main main.cpp)
target_link_libraries(main bingitup)

bingitup est le même nom que vous donneriez à une cible si vous créez la bibliothèque statique dans un projet CMake:

add_library(bingitup STATIC bingitup.cpp)

CMake ajoute automatiquement le lib et le .a au premier plan sous Linux, et .lib à la fin sous Windows.

Si la bibliothèque est externe, vous pouvez ajouter le chemin d'accès à la bibliothèque à l'aide de

link_directories(/path/to/libraries/)
19
Cris Luengo

J'ai trouvé cela utile ...

http://www.cmake.org/pipermail/cmake/2011-June/045222.html

De leur exemple:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)
18
stu