2012-06-19 91 views
1

我对使用其他静态库的静态库有疑问。依赖于其他静态库的静态库

我设置了一个包含3个文件的例子 - main.cpp,slib1.cpp和slib2.cpp。 slib1.cpp和slib2.cpp都被编译为独立的静态库(例如,我最终得到了slib1.a和slib2.a),main.cpp被编译成了一个标准的ELF可执行文件,可链接两个库。
还有一个名为main.h的头文件,它在slib1和slib2中对函数进行原型设计。

main.cpp从slib2调用一个名为lib2func()的函数。该函数依次调用slib1中的lib1func()。

如果我按原样编译代码,g ++将返回一个链接器错误,指出它无法在slib1中找到lib1func()。但是,如果我在调用slib2中的任何函数之前调用lib1func(),代码将编译并正常工作。

我的问题是简单如下:是否有可能创建一个静态库,依赖于另一个静态库?如果这是不可能的,那看起来会是一个非常严重的限制。

针对此问题的源代码附加如下:

main.h:

#ifndef MAIN_H 
#define MAIN_H 

int lib1func(); 
int lib2func(); 

#endif 

slib1.cpp:

#include "main.h" 

int lib1func() { 
    return 1; 
} 

slib2.cpp:

#include "main.h" 

int lib2func() { 
    return lib1func(); 
} 

main.cpp:

#include <iostream> 
#include "main.h" 

int main(int argc, char **argv) { 
    //lib1func(); // Uncomment and compile will succeed. WHY?? 

    cout << "Ans: " << lib2func() << endl; 
    return 0; 
} 

gcc的输出(带有行注释掉):

g++ -o src/slib1.o -c src/slib1.cpp 
ar rc libslib1.a src/slib1.o 
ranlib libslib1.a 
g++ -o src/slib2.o -c src/slib2.cpp 
ar rc libslib2.a src/slib2.o 
ranlib libslib2.a 
g++ -o src/main.o -c src/main.cpp 
g++ -o main src/main.o -L. -lslib1 -lslib2 
./libslib2.a(slib2.o): In function `lib2func()': 
slib2.cpp:(.text+0x5): undefined reference to `lib1func()' 
collect2: ld returned 1 exit status 

GCC输出(带行注释掉)

g++ -o src/slib1.o -c src/slib1.cpp 
ar rc libslib1.a src/slib1.o 
ranlib libslib1.a 
g++ -o src/slib2.o -c src/slib2.cpp 
ar rc libslib2.a src/slib2.o 
ranlib libslib2.a 
g++ -o src/main.o -c src/main.cpp 
g++ -o main src/main.o -L. -lslib1 -lslib2 

$ ./main 
Ans: 1 

回答

2

顺序赚取差价。下面是从gcc(1)手册页:

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o. If bar.o refers to functions in z, those functions may not be loaded.
+0

有图书馆之间循环依赖甚至有可能。在这种情况下,您需要在命令行上提供两个库中的一个。 –

+0

或按照@Ruben的建议使用链接器选项。 –

相关问题