我有一个关于制作使用其他静态库的静态库的问题。
我设置了一个包含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
答案 0 :(得分:3)
请尝试g++ -o main src/main.o -L. -Wl,--start-group -lslib1 -lslib2 -Wl,--end-group
。
使用--start-group
定义的组,--end-group
有助于解决库之间的循环依赖关系。
另请参阅:GCC: what are the --start-group and --end-group command line options?
答案 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.