CMake.

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ć?

3
  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 $@ $<
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.

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

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