使用C++编译程序,有时会出现这个错误:
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
具体原因有许多,目前遇到的有这些:
1. template的使用问题--模版类的声明和模版类的实现分开:
C++的模版编译标准有两种方式:
1. 分离式 (允许模版类的声明和实现分开)使用关键字export即可。但由于这是C++03的标准了,许多主流的编译器都不再支持这种方式了(包括我的clang)。到了C++ 11,便完全放弃了。
2. 包含式(目前使用的模版编译标准)要求模版类的声明和实现放在一起。
因为现在较新的C++编译器都只支持包含式了,所以把声明和实现分开,就会报错。但是,我测试过了,假设有两个文件:模版类的声明和实现,不加export关键字,编译出模版类的.o文件是没有问题的。只有在将demo文件main.o(含模版类实例化语句)和模版类的.o文件链接起来的时候,才会出现链接错误(linker error)。
References:
[1] http://www.zhihu.com/question/20630104
[2] 《C++ Primer Plus sixth edition》P569
2. 函数没有实现或找不到
举个例子:有两个文件:main.cpp 和 LinkedList.cpp,当main.cpp中使用了LinkedList.cpp中的函数。这个函数还没实现的。把这两个文件编译成.o文件的时候没有问题。但是链接的时候会出问题。
然后还有一个找不到,其实就是一个函数找不到另外一个函数,换言之,即不在一个域(scope)里面。
这是发生概率最高的,此种类型的错误通过log的信息很容易能找出来。