我在Linux上使用g++ 5.3.0
。
我以为我自己会成为一个目标文件,在链接时会初始化全局变量Argc
和Argv
,以便在整个过程中main
参数可用。< / p>
Argv.hh:
#pragma once
extern char** Argv;
extern int Argc;
Argv.cc:
char** Argv;
int Argc;
static int set_argv(int argc, char** argv, char** env) { Argc = argc; Argv = argv; return 0; }
/* Put the function into the init_array */
__attribute__((section(".init_array"))) static void *ctr = (void*)&set_argv;
main.cc
#include "Argv.hh"
#include <stdio.h>
int main(){
for (int i = 0; i < Argc; ++i){
puts(Argv[i]);
}
return 0;
}
我原来的构建脚本是:
com='g++ -std=c++1y'
for cc in *.cc; do $com -c $cc; done
g++ *.o
但它一直给我一个链接错误。所以我将com
更改为
gcc -x c -std=c99
它有效,而且它也适用于普通com=g++
。
三个编译器中的每一个都成功编译,只有链接部分失败了g++ -std=c++1y
。
nm *.o
输出:
gcc -x c -std=c99
:
Argv.o:
0000000000000004 C Argc
0000000000000008 C Argv
0000000000000000 t ctr
0000000000000000 t set_argv
main.o:
U Argc
U Argv
0000000000000000 T main
U puts
g++
:
Argv.o:
0000000000000008 B Argc
0000000000000000 B Argv
0000000000000000 t _ZL3ctr
0000000000000000 t _ZL8set_argviPPcS0_
main.o:
U Argc
U Argv
0000000000000000 T main
U puts
对于g++ -std=c++1y
:
Argv.o:
0000000000000008 B Argc
0000000000000000 B Argv
0000000000000000 t _ZL3ctr
0000000000000000 t _ZL8set_argviPPcS0_
main.o:
0000000000000008 B Argc
0000000000000000 B Argv
0000000000000000 T main
U puts
最后一组目标文件无法与
链接main.o:(.bss+0x0): multiple definition of `Argv'
Argv.o:(.bss+0x0): first defined here
main.o:(.bss+0x8): multiple definition of `Argc'
Argv.o:(.bss+0x8): first defined here
collect2: error: ld returned 1 exit status
为什么g++ -std=c++1y
生成extern
声明的B符号,而其他两个生成(因为它们应该?)未定义的引用?这是一个错误吗?