C ++ Project Layout кажется неправильным, компилятор не может найти файлы реализации - PullRequest
0 голосов
/ 05 октября 2011

Я пишу пакет 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.

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

Ответы [ 2 ]

0 голосов
/ 06 октября 2011

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

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

Приветствия

0 голосов
/ 05 октября 2011

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

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

...