C ++ Project Layout似乎不正确,编译器无法找到实现文件

时间:2011-10-05 16:43:21

标签: c++ compilation include project-management structure

我正在编写一个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.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的{​​{1}}的实现。

我认为这是因为文件夹结构,你能告诉我如何解决这个问题吗? 即使将<{1}}添加到include指令,也不会修复它。 (而且我也不想将它添加到包含路径中,因为这对包来说非常不方便。)

2 个答案:

答案 0 :(得分:0)

您可以发布您使用的编译命令吗?

好像你只编译main.cpp而不编译(并因此链接)其他.cpp文件。

答案 1 :(得分:0)

我现在可以发现错误,cnArray.h声明了一个模板类,模板类不能在另一个文件中被声明,因为编译时必须知道编译时的实现,而不是链接时。

我在互联网上找到了#include头文件中>实现的解决方法,但是从编译中排除了实现文件。 现在效果很好。

干杯