链接c代码到c ++代码时,g ++链接顺序依赖关系
在今天之前,我一直认为在连接阶段把对象和库传给g ++的顺序是不重要的。 然后,今天,我试图从c ++代码链接到c代码。 我将所有的C头文件封装在一个extern“C”块中,但是链接器仍然有困难find我知道在C对象存档中的符号。
困惑,我创build了一个相对简单的例子来隔离链接错误,但令我惊讶的是,更简单的例子没有任何问题。
经过一些试验和错误之后,我发现通过模拟简单例子中使用的链接模式,我可以得到主代码链接OK。 该模式是目标代码第一,对象档案第二例如:
g++ -o serverCpp serverCpp.o algoC.o libcrypto.a
任何人都可以阐明为什么这可能是这样的? 链接普通的c ++代码时,我从来没有见过这个问题。
你指定的目标文件和库的顺序在GCC中是非常重要的 – 如果你还没有被这个叮咬过, 链接器按照它们出现的顺序search符号,所以如果你有一个包含对库函数调用的源文件,你需要把它放在库之前,否则链接器不会知道它必须解决它。 图书馆的复杂使用可能意味着你必须多次指定图书馆,这是一个皇家的痛苦,才能得到正确的。
库命令传递给gcc / g ++确实很重要。 如果A
取决于B
,则A必须首先列出。 原因是它优化了没有引用的符号,所以如果它首先看到库B
,并且没有人引用它,那么它根本就不会链接任何东西。
静态库是分组到一个档案中的对象文件的集合。 链接时,链接器只会select它需要的对象来parsing当前未定义的符号。 由于这些对象是按命令行给出的顺序链接的,因此只有在库依赖它的所有对象之后才能包含库中的对象。
所以链接顺序非常重要。 如果你打算使用静态库,那么你需要小心跟踪依赖关系,而不要在库之间引入循环依赖关系。