C++ 如何使用GCC基于其他静态库创建静态库?

C++ 如何使用GCC基于其他静态库创建静态库?,c++,gcc,linker,static-libraries,ld,C++,Gcc,Linker,Static Libraries,Ld,我想使用一些现有的静态库:libX.a、libY.a、libZ.a和一些对象文件创建一个名为libXYZ.a的静态库。我用来构建静态库libXYZ.a的命令行是: 我正在使用Cygwin GCC g++编译one.cpp和two.cpp,以在ld命令之前获得one.o和two.o,如下所示: g++ -o one.o one.cpp -c g++ -o one.o two.cpp -c libX.a、libY.a、libZ.a都位于当前目录中,这就是为什么-L./。我在LD行中添加了C++标准

我想使用一些现有的静态库:libX.a、libY.a、libZ.a和一些对象文件创建一个名为libXYZ.a的静态库。我用来构建静态库libXYZ.a的命令行是:

我正在使用Cygwin GCC g++编译one.cpp和two.cpp,以在ld命令之前获得one.o和two.o,如下所示:

g++ -o one.o one.cpp -c
g++ -o one.o two.cpp -c
libX.a、libY.a、libZ.a都位于当前目录中,这就是为什么-L./。我在LD行中添加了C++标准库链接标志-LSTDC++。但我做的时候犯了以下错误:

one.o: one.cpp:(.text+0x32): undefined reference to `_Unwind_Resume'
ld: one.o: bad reloc address 0xd in section `.text$_ZN10ConfigC1Ev[__ZN10ConfigC1Ev]'
Makefile:22: recipe for target 'libXYZ.a' failed
所以我的问题是:ld命令是从其他静态lib和.o文件构建静态lib的正确命令吗?是什么导致了这个错误?我搜索了论坛,发现这可能是由一些不兼容的编译器引起的。但是我使用相同的GCC编译器构建了所有的源代码

更新:

我再次尝试使用以下命令:

ld -o libXYZ.a one.o two.o -L./ -lX -lY -lZ
但我仍然得到以下错误:

one.o:one.cpp:(.text+0x32): undefined reference to `_Unwind_Resume'
one.o:one.cpp:(.text+0x12a): undefined reference to `_Unwind_Resume'
...
./libX.a(wrapper.o):wrapper.cpp:(.text+0x7ba): undefined reference to `__chkstk_ms'
./libX.a(wrapper.o):wrapper.cpp:(.text+0x7ba): undefined reference to `_Unwind_Resume'
...
我省略了许多类似的错误,比如上面的_Unwind _Resume错误。你知道是什么导致了这些错误吗

所以我的问题是:ld命令是从其他静态lib和.o文件构建静态lib的正确命令吗


否。请查看如何实现此功能。

这应该可以实现:不幸的是,我的cygwin gcc不支持libtool,只支持ld。如果我使用ar而不是ld命令链接三个静态lib,就像您提供的链接一样,那么我需要执行三个ar-x命令,然后再执行一个ar-c命令链接所有提取的*.o对象文件。是否有一种一次性解决方案,使用ar或ld将libX.a、libY.a、libZ.a与当前目录中的两个对象文件链接起来:one.o、two.o以形成新的静态libXYZ.a?IMHO使用四个ar命令来提取和压缩LIB太麻烦了。@tonga使用四个ar命令来提取和压缩LIB太麻烦了-不要手工操作,而是编写Makefile。封装ar调用的shell脚本编写起来也非常简单。
one.o:one.cpp:(.text+0x32): undefined reference to `_Unwind_Resume'
one.o:one.cpp:(.text+0x12a): undefined reference to `_Unwind_Resume'
...
./libX.a(wrapper.o):wrapper.cpp:(.text+0x7ba): undefined reference to `__chkstk_ms'
./libX.a(wrapper.o):wrapper.cpp:(.text+0x7ba): undefined reference to `_Unwind_Resume'
...