3

我主要基于标头的库使用放置在库命名空间 (BigNum) 中的全局变量。变量的定义如下:

namespace BigNum{
/**
* __Some lower powers of ten prestored for fast runtime lookup.__*/
const uintmax_t pten[20]={
1LU, 10LU, 100LU, 1000LU, 10000LU, 100000LU, ....
};
}

只要我在我的 main.cpp 文件中有这个定义(实际上是我的测试配置中唯一的非头文件)并且我的头文件extern uintmax_t pten[];在其中(假设它们还包括 cstdint,其中 uintmax_t 是类型定义的),一切都可以正常工作。

但是,我想在其他地方有这个定义,所以我创建了一个 global.cpp 文件,上面的内容作为其内容,并确保我的 Makefile 将它链接到其余文件。有趣的是,在 main.cpp 和 global.cpp 中使用 pten 的定义进行编译可以正常工作(我预计会出现双重定义错误),但是从 main.cpp 中删除定义而将其保留在 global.cpp 中会导致链接错误。

我检查了生成的 global.o,它确实包含 pten 符号(它的错位形式)。尝试以任一顺序手动将 main.o 与 global.o 链接失败。

有任何想法吗?

附加信息: 这是一个演示问题的基本示例。

主文件

    #include <cstdint>
    #include <iostream>

    namespace BigNum{
    extern const uintmax_t pten[];
    }
    int main( int argc, const char *argv[] )
    {
        using namespace std;

        cout<<BigNum::pten[0]<<endl;
        return 0;
    }

全球.cpp

    #include <cstdint>

    namespace BigNum{
    /**
     * __Some lower powers of ten prestored for fast runtime lookup.__
     */
    const uintmax_t pten[20]={
        1LU, 10LU, 100LU, 1000LU, 10000LU, 100000LU, 1000000LU, 10000000LU, 100000000LU, 1000000000LU, 10000000000LU, 100000000000LU, 1000000000000LU, 10000000000000LU, 100000000000000LU, 1000000000000000LU, 10000000000000000LU, 100000000000000000LU, 1000000000000000000LU, 10000000000000000000LU
    };
    }

汇编:

  g++ -std=c++0x -c global.cpp -o global.o
  g++ -std=c++0x -c main.cpp -o main.o
  g++ -std=c++0x global.o main.o

 >main.o: In function `main':
 >main.cpp:(.text+0x12): undefined reference to `BigNum::pten'
 >collect2: ld returned 1 exit status
4

2 回答 2

2

您在 global.cpp 中的代码应该是:

#include <cstdint>

namespace BigNum{
/**
 * __Some lower powers of ten prestored for fast runtime lookup.__
 */
extern const uintmax_t pten[]; //This should go in a common header file
const uintmax_t pten[20]={
    1LU, 10LU, 100LU, 1000LU, 10000LU, 100000LU, 1000000LU, 10000000LU, 100000000LU, 1000000000LU, 10000000000LU, 100000000000LU, 1000000000000LU, 10000000000000LU, 100000000000000LU, 1000000000000000LU, 10000000000000000LU, 100000000000000000LU, 1000000000000000000LU, 10000000000000000000LU
};
}

检查本指南:通常,您会放入extern const uintmax_t pten[];一个单独的通用头文件。

于 2013-06-23T16:43:03.720 回答
-1

问题解决了。事实证明,与函数不同,所有全局变量对其他编译单元都是不可见的。为了使它们可见,extern关键字也必须在它们的定义中使用(在 global.cpp 中)。

于 2013-06-23T15:40:00.803 回答