Макет проекта C кажется неправильным, компилятор не может найти файлы реализации

#c #compilation #include #project-management #structure

#c #Сборник #включить #управление проектами #структура

Вопрос:

Я пишу пакет C для последующего использования с использованием Code::Blocks.
Структура проекта выглядит следующим образом:

 cNormal
    cNormal.cdp
    src
        main.cpp            # for testing purpose
        cnormal_defs.h      # important compiler definitions
        cnormal_storage.h   # includes all .h files from "./storage"
        storage
            cnarray.h
            cnarray.cpp
            cnstack.h
            cnstack.cpp
    bin
    obj
  

Файл cnormal_storage.h:

 // cnormal_storage.h
// *****************************************************************
// Includes all necessary headers for the cNormal storage subpackge.
//

#ifndef _cNORMAL_STORAGE_H_
#define _cNORMAL_STORAGE_H_

    #include "storage/cnarray.h"
    #include "storage/cnstack.h"

#endif // _cNORMAL_STORAGE_H_
  

Чтобы протестировать классы, я создаю main-функцию в main.cpp .

 // main.cpp
// *****************************************************************
// The main-file.
//
#include <iostream>
#include "cnormal_storage.h"

using namespace std;

int main() {
    cnArry<int> arr(10);
    arr[9] = 999;
    arr[0] = 0;
    cout << arr[9] << endl;
    cout << arr.getLength();
}
  

Но компилятор (gcc) выдает мне undefined reference to ... ошибки cnArray .

Теперь cnarray.cpp включает cnarray.h (поскольку это файл реализации), поэтому с помощью
#include "storage/cnarray.cpp" работает просто отлично.

Похоже, что компилятор не может найти реализацию cnarray.h , в которой находится cnarray.cpp .

Я предполагаю, что это из-за структуры папок, можете ли вы сказать мне, как я могу это исправить?
Даже добавление srcstorage к директивам include не исправляет это. (И я также не хочу добавлять его во включаемые пути, поскольку это было бы очень неудобно для пакета.)

Комментарии:

1. undefined reference это ошибка компоновщика , а не ошибка компилятора. main.cpp компилируется просто отлично и находит заголовок соответствующим образом. Вы не компилируете два других файла .cpp.

Ответ №1:

Можете ли вы опубликовать команду компиляции, которую вы используете?

Похоже, вы компилируете только main.cpp и не компилировать (и, следовательно, не связывать) другие .cpp файлы.

Комментарии:

1. Я использую Code::Blocks, cnarray.cpp помечается как «Компиляция» и «Ссылка». Я мог бы предоставить весь исходный код, для меня это не было бы проблемой.

2. Кстати, я вижу cnarray.cpp компилируется в Debugsrcstoragecnarray.o , может ли это вызвать ошибку, что он находится не в том же каталоге, main.o что и?

3. @NiklasR нет, ошибка в том, что на него cnarray.o не ссылаются main.o . Неопределенная ссылка означает, что компоновщик (последний шаг компиляции) не находит main.cpp используемые символы. К сожалению, я не знаю вашего редактора. Попробуйте самостоятельно с помощью командной строки: gcc main.cpp storage/.cpp -o main

Ответ №2:

Теперь я смог обнаружить ошибку, cnArray.h объявленный класс шаблона и классы шаблонов не могут быть внедрены в другой файл, чем они объявлены, потому что компилятор должен знать о реализации при компиляции, а не при компоновке.

Я нашел в Интернете обходной путь к #include реализации в файле заголовка, но исключил файл реализации из компиляции. Теперь это работает просто отлично.

Приветствия