2011-09-06 87 views
0

归档程序和链接程序都忽略重复的标识符。只有在源或目标文件直接传递给gcc时才会检测到它们,这会将多个定义视为错误。它应该如此。归档器/链接器简单地忽略它们,并且最终只有可执行文件中的一个标识符。哪一个取决于目标文件或库传递的顺序。下面是一个脚本来演示这一点。gcc:目标文件或库中的重复标识符

有什么办法让存档/链接器认为这是一个错误?还是有其他工具可以解决这个问题吗?

#!/bin/sh 

dir=$(mktemp -d) 
echo "Using temporary directory: $dir" 
echo 
cd "$dir" 

create_lib() 
{ 
    lib=$1 
    shift 
    rm -f $lib 
    ar r $lib "[email protected]" 2>/dev/null 
} 

make_file() 
{ 
    base=file$1 
    cat >$base.c <<-EOF 
    int f() 
    { 
     return $1; 
    } 
    EOF 

    gcc $base.c -o $base.o -c 

    create_lib lib$base.a $base.o 
} 

make_file 1 
make_file 2 

cat >main.c <<EOF 
int main() 
{ 
    extern int f(); 
    return f(); 
} 
EOF 

gcc main.c -omain.o -c 

cat <<EOF 
1. Passing duplicate functions to archiver in different order 
    produces no error, but different result: 
EOF 

create_lib libfile.a file1.o file2.o 
gcc main.o libfile.a -omain 
(echo -n "ar file1.o file2.o: "; ./main; echo $?) 

create_lib libfile.a file2.o file1.o 
gcc main.o libfile.a -omain 
(echo -n "ar file2.o file1.o: "; ./main; echo $?) 

echo 

cat <<EOF 
2. Passing duplicate libraries to linker in different order 
    produces no error, but different result: 
EOF 

gcc main.o libfile2.a libfile1.a -omain 
(echo -n "gcc libfile2.a libfile1.a: "; ./main; echo $?) 

gcc main.o libfile1.a libfile2.a -omain 
(echo -n "gcc libfile1.a libfile2.a: "; ./main; echo $?) 

输出示例:

Using temporary directory: /tmp/tmp.AaXzxGcSdd 

1. Passing duplicate functions to archiver in different order 
    produces no error, but different result: 
ar file1.o file2.o: 1 
ar file2.o file1.o: 2 

2. Passing duplicate libraries to linker in different order 
    produces no error, but different result: 
gcc libfile2.a libfile1.a: 2 
gcc libfile1.a libfile2.a: 1 

回答

0

我认为你可以得到你想要传递给链接的--whole-archive选项的行为。从GNU LD文档:

--whole-archive

对于 --whole-archive选项后,在命令行中提到的每个归档,在归档中包括的每个目标文件中 的链接,而不是搜索的归档需要的对象 文件。这通常用于将档案文件转换为共享库,强制每个对象包含在生成的共享库 中。该选项可能会多次使用。

从gcc使用此选项时有两点需要注意:首先,gcc不知道关于此选项的 ,因此您必须使用-Wl,-whole-archive。第二, 不要忘记在你的档案清单 之后使用-Wl,-no-whole-archive,因为gcc会将你自己的档案列表添加到你的链接中,你也可能不想让这个标志影响这些档案。

+0

感谢您的提示。但是,似乎对我的测试没有帮助。 – drizzd