#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
реализации в файле заголовка, но исключил файл реализации из компиляции. Теперь это работает просто отлично.
Приветствия