运用this great answer关于GCC链接顺序的例子,我试过如下:为什么gcc链接程序与.a文件和.o文件的行为不同?
echo 'extern int b; int a = b;' > b.cpp
g++ -c b.cpp -o b.o
ar cr libb.a b.o
echo 'int b;' > d.cpp
g++ -c d.cpp -o d.o
ar cr libd.a d.o
echo 'extern int a; int main() { return a; }' > a.cpp
g++ a.cpp -o a1 d.o b.o # Works
g++ a.cpp -o a2 libd.a libb.a # Fails
如果.a
文件仅仅是包含一个或几个.o
文件,如何来与lib*.a
文件链接(归档文件按照原始答案中说明的错误顺序)失败,但直接使用.o
文件(以相同的顺序)有效吗?
如果库从左到右未解析符号,则会忽略它们。 .o文件不会被忽略。 –
@HansPassant:这背后的基本原理是什么?最后,无论如何,只有需要的部分才会保留在最终的二进制文件中,对吗?有没有办法使库的行为与对象文件相同,除了从档案中提取文件并直接与它们链接? – Masseman
这很主观。总的来说,这是工具制造商和程序员之间的永恒战斗。工具构建者喜欢使他们的工具运行速度快,并且不占用大量内存。他们通常会赢。我使用的链接程序不会执行此操作,它会通过.lib文件进行两次传递。但它有一个1-800支持电话号码。 –