Как правильно структурировать проект C?

Недавно начал изучать C. Всё шло хорошо, пока я работал в одном файле. Сейчас я решил разбить код на несколько файлов и тут код перестал работать. Что я предпринял.
Вариант 1:
--cmake-build-debug
--CMakeLists.txt
--library.c
--library.h
--printer.c

В CMakeLists.txt
cmake_minimum_required(VERSION 3.24)
project(dbc C)

set(CMAKE_C_STANDARD 11)

add_library(dbc library.c library.h printer.c)


В library.h
#ifndef DBC_LIBRARY_H
#define DBC_LIBRARY_H

void print();

#endif //DBC_LIBRARY_H


В library.с
#include "library.h"

int main() {
    print();

    return 0;
}


В printer.c
#include "library.h"
#include "stdio.h"

void print() {
    printf("Hello, world!\n");
}


CMake не жалуется. Но при попытке запустить проект вижу:
undefined reference to `print'


Но вариант 2 мне более интересен:
--cmake-build-debug
--CMakeLists.txt
--library.c
--library.h
--printer
----printer.c
----printer.h

Код почти такой же, в CMake
cmake_minimum_required(VERSION 3.24)
project(dbc C)

set(CMAKE_C_STANDARD 11)

add_library(dbc library.c library.h printer/printer.c printer/printer.h)


в printer.c

#include "printer.h"
#include "stdio.h"

void print() {
    printf("Hello, world!\n");
}


В printer.h
#ifndef DBC_PRINTER_H
#define DBC_PRINTER_H

void print();

#endif


В library.h
#ifndef DBC_LIBRARY_H
#define DBC_LIBRARY_H

#endif


в library.c
#include "printer/printer.h"
#include "library.h"

int main() {
    print();

    return 0;
}


И ошибка та же. CMake пишет:

-- Configuring done
-- Generating done
-- Build files have been written to: D:/domains/fastdb/dbc/cmake-build-debug

Я зашёл в cmake-build-debug и не нашёл там никакого exe или чего-то подобного.
Что исправить, чтобы код скомпилировался?
  • Вопрос задан
  • 227 просмотров
Пригласить эксперта
Ответы на вопрос 1
@tin_vsl
Senior Developer
Скорее всего вам нужно перечислять файлы в другом порядке, чтобы они собирались в правильном порядке и их содержимое было видно там, где будет использоваться.

Для первого варианта, думаю так:
add_library(dbc printer.c library.c library.h)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы