2015-02-09 83 views
3

我正在为C++库(ITK)创建一个外部模块,我正在用cmake和make(我在Ubuntu VM上)构建它。为什么当我链接到一个库时会出错,但是当我构建它时不会出错?

假设代码中存在错误,例如重新定义方法。在这种情况下,该库与cmake ../src && make && sudo make install构建时没有错误,但是当我尝试将某个项目链接到库时出现错误。

为什么错误不会停止库的构建? make的行为有所不同,这些情况是否有根本性的不同?我对C++(以及一般的编译语言)相当陌生 - 我想有一些关于构建过程的基础知识,我并不了解。我发现很难搜索这个 - 搜索“C++库没有编译错误”给了我很多关于C++库编译错误的线程。

+0

你在链接时得到的是什么错误? – 2015-02-09 12:35:55

+0

那么,在方法重定义的例子中,类似'error:redefinition o f'void itk :: PhaseDerivativeVarianceImageFilter :: PrintSelf(std :: ostream&,itk :: Indent)const'' – 2015-02-09 12:37:18

+0

一般我明白这些错误来自哪里,一旦我得到它们 - 我只是不理解编译器在编译库时为什么不选择它们。 – 2015-02-09 12:38:03

回答

1

一般来说,库只是编译代码 - 对象文件的集合。通常,只有在创建可执行文件时,链接器才会尝试确保可执行文件中使用的所有符号可以通过链接的库来解析,因此您将看到链接错误。

如果一个符号(函数,常数等)的定义或者不能找到或是不明确的(即,可以在一个以上的地方找到,则链接失败。

+0

谢谢 - 我认为我不了解的基本原理是,在构建库时,它会分别查看每个“对象”(如方法定义),而不会尝试将它们彼此关联。所以如果我有一个普通的无效C++(比如一个流浪的反斜杠或者其他东西),我会得到一个错误。这现在有道理。 – 2015-02-09 14:10:16

1

虽然联,它检查横 - 引用,符号(函数,标识符等)定义和调用或使用被绑定到静态链接中(动态链接是不同的,因为这是延迟链接,因此交叉引用可能不会完成)库是一个简单的函数或标识定义集合,不会做交叉引用

相关问题