CMake: pomoc przy konfiguracji, jak użyć static library w pliku wykonywalnym?

0

Chciałem zbudować projekt zgodnie z dobrymi praktykami programowania, dlatego postanowiłem skorzystać z gotowej templatki dla projektu C++ przystosowanego do Test Driven Development budowanego przy pomocy CMake: Link do templatki tutaj, moja konfiguracja CMake w zasadzie pozostała bez zmian.

Cookiecutter generuje mi projekt w postaci Static library. Tworzy się więc, o ile dobrze rozumiem, binarka gotowa do podlinkowania do innego projektu (?). Ja natomiast, oprócz zbudowania takiej biblioteki, chciałbym otrzymać także plik wykonywalny który by tą bibliotekę wykorzystywał. To znaczy chcę mieć plik main.cpp który dla demostracji wykona jakieś komendy ze Static Library i zwróci wynik.

Teraz tak: na logikę mógłbym dopisać na koniec pliku src/CMakeList.txt linijkę:

add_executable(app_exec ${PROJECT_SRCS})

która znajdzie mi pliki *.cpp w folderze src i utworzy plik wykonywalny. Z tym że odbędzie się to niejako z pominięciem tworzonego przez CMake Static library. Ja natomiast chciałbym bezpośrednio użyć mojego Static Library w logicznie oddzielnym projekcie w którym jest main.cpp.

Byłby mi ktoś w stanie podpowiedzieć jak zorganizować ten projekt żeby to miało ręce i nogi?

PS: Być może piszę głupoty, to jeden z moich pierwszych kontaktów z CMake. Jak to co piszę nie ma sensu, to proszę o jakąś konstruktywną krytykę

1

wydaje mi się że powinieneś użyć czegoś takiego: target_link_libraries(${PROJECT_NAME} nazwa_twojej_libki)

0

Byłby mi ktoś w stanie podpowiedzieć jak zorganizować ten projekt żeby to miało ręce i nogi?

Najlepiej byłoby chyba stworzyć cmake'owy target. Nie wiem jaki tam jest rozkład katalogów, ale byłoby to coś w tym stylu:

add_library(CookieLibrary INTERFACE)
target_include_directories(CookieLibrary SYSTEM INTERFACE "<CookieLibrary directory>/include/")
file(GLOB CookieLibrary_HEADER_FILES <CookieLibrary directory>/include/*.h)
target_sources(CookieLibrary INTERFACE ${CookieLibrary_HEADER_FILES })
target_link_libraries(CookieLibrary INTERFACE
        <CookieLibrary directory>/lib/libCookieLibrary.a
        )

CookieLibrary to wybrana przez Ciebie nazwa, podstaw jakkolwiek ta biblioteka ma się nazywać, z wyjątkiem libCookieLibrary.a, tutaj musisz podać nazwę faktycznej libki ;) I wtedy używasz tego tak:

add_executable(${PROJECT_NAME} src/main.cpp)

target_link_libraries(${PROJECT_NAME}Static
    CookieLibrary
)

Taki układ ma taką zaletę, że kod odpowiedzialny za eksport targetu dla Twojej libki możesz wynieść do osobnego CMakeList.txt i zainkludować dla innej binarki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1