CMake.

Odpowiedz Nowy wątek
2019-04-14 23:35
0

Witam, chciałbym się zapytać czy dobrze rozumiem działanie i tworzenie pliku CMake.
Otóż na linuxie mam pliki: main.cpp, auto.hpp, auto.cpp, kolo.hpp, kolo.cpp.
W pliku auto.hpp załączam plik kolo.hpp, a w pliku main.cpp załączam plik auto.hpp i tworzę obiekty aut. Dodatkowo chcę skorzystać z biblioteki thread.

Czy plik CMake powinien wyglądać tak?

cmake_minimum_required(VERSION 3.14)
project(Nazwa_projektu)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")

set(SOURCES main.cpp auto.cpp auto.hpp kolo.cpp kolo.hpp)
add_executable(nazwa_programu_wykonywalnego ${SOURCES})

target_link_libraries(Nazwa_projektu pthread)

Mam także pytanie, czy kolejność w plikach źródłowych ma jakieś znaczenie?
Gdzie mogę sprawdzić błędy uruchamiając CMake z konsoli?
Jeśli nie było by to problemem czy mógłby ktoś napisać mi Makefile, żebym mógł to też porównać?

edytowany 1x, ostatnio: Isild, 2019-04-14 23:42

Pozostało 580 znaków

2019-04-15 00:49
  1. Kolejność plików nie powinna mieć znaczenia. Każdy plik możesz skompilować odpowiednio komendą g++ -c -std=c++11 plik.cpp. Na tym etapie ich nie linkujesz.
  2. Jeśli w plikach .cpp używasz include z "" zamiast <>, np. `include "auto.hpp" i pliki .hpp są faktycznie nagłówkami, to nie musisz ich podawać nigdzie w tym pliku. W szczególności nie możesz ich dodać do SOURCES.
  3. Linia set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread") jest nadmiarowa, skoro użyłeś set(CMAKE_CXX_STANDARD 11) - ekwiwalent -std=c++11. Zamiast podawać -pthread bezpośrednio w flagach, możesz użyć find_package(Threads REQUIRED).
  4. Jak wywołasz z linii komend cmake <katalog z plikiem CMakeLists.txt, to program wypisuje rezultaty operacji, wyjście trzeba przeczytać, nie kojarzę łatwego sposobu oddzielenia informacji od błędów. W szczególności, jeśli cokolwiek się nie uda, to niemożliwe będzie poprawne wywołanie make.
  5. Uproszczony makefile
    CXX=g++
    SOURCES = main.cpp auto.cpp kolo.cpp
    OBJECTS = main.o auto.o kolo.o
    CXXFLAGS = -std=c++11 -pthread
    LFLAGS = -lpthread
    EXEC_NAME = binarka
    build: $(OBJECTS)
        $(CXX) $(CXXFLAGS) $(OBJECTS) -o $(EXEC_NAME) $(LFLAGS)
    # Kompilowanie pojedynczych plików
    %.o: %.cpp
        $(CXX) -c $(CXXFLAGS) -o [email protected] $<
edytowany 1x, ostatnio: zagura, 2019-04-15 00:50

Pozostało 580 znaków

2019-04-15 20:30
2
zagura napisał(a):
  1. Jeśli w plikach .cpp używasz include z "" zamiast <>, np. `include "auto.hpp" i pliki .hpp są faktycznie nagłówkami, to nie musisz ich podawać nigdzie w tym pliku. W szczególności nie możesz ich dodać do SOURCES.

Jak najbardziej można dodawać pliki nagłówkowe do listy źródeł - CMake używa rozszerzenia pliku, żeby zdecydować czy dany plik ma być kompilowany (link). Nagłówki są często dodawane do źródeł, bo niektóre IDE nie wyświetlają plików nienależących do któregoś z targetów.

Pozostało 580 znaków

2019-04-16 12:15
0
zagura napisał(a):
  1. Jeśli w plikach .cpp używasz include z "" zamiast <>, np. `include "auto.hpp" i pliki .hpp są faktycznie nagłówkami, to nie musisz ich podawać nigdzie w tym pliku. W szczególności nie możesz ich dodać do SOURCES.

Możesz podać źródło/wyjaśnienie?
AFAIK w cmake powinno się wymieniać wszystkie pliki nagłówkowe.
Jedyna różnica jest taka, że mogą być INTERFACE PUBLIC PRIVATE https://cmake.org/cmake/help/latest/command/target_sources.html
A #include"" od #include<> różni się kolejnością przeszukiwania ścieżek, pierwsze przeszukuje najpierw ścieżki projektu, a drugie najpierw ścieżki zależności (bibliotek).
Czyli dla obcych nagłówków używa się #include<>
Dla nagłówków danego projektu używa się #include"", chyba że są to include z publicznego nagłówka wtedy #include<> (żeby konsument biblioteki mógł prawidłowo używać nagłówka).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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