您的位置:首页 > 大数据 > 人工智能

error: linker command failed with exit code 1 (use -v to see invocation)

2015-08-14 13:22 585 查看
使用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的信息很容易能找出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: