我主要基于标头的库使用放置在库命名空间 (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