C++ 使用`g++-std=c++;1元';t链接

C++ 使用`g++-std=c++;1元';t链接,c++,c++11,gcc,C++,C++11,Gcc,我使用的是Linux上的g++5.3.0 我想我应该创建一个对象文件,当链接时,它将初始化全局变量Argc和Argv,以便main参数在整个过程中都可用 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

我使用的是Linux上的
g++5.3.0

我想我应该创建一个对象文件,当链接时,它将初始化全局变量
Argc
Argv
,以便
main
参数在整个过程中都可用

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
更改为
gcc-xc-std=c99
它工作了,它也可以与普通的
com=g++
一起工作

三个编译器中的每一个都成功编译,只有链接部分失败,出现
g++-std=c++1y

nm*.o
输出:

对于
gcc-xc-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符号,而其他两个声明生成(它们应该)未定义的引用?这是一个bug吗?

如果C++代码测试使用<代码> CSTDIO .H/COD>而不是<代码> STDIO?H/COD>,会发生什么?我只是随便猜一猜。
nm
显示了BSS部分(
B
)中变量的非零默认值,这让我有点惊讶——我不确定是怎么回事。不过,可能与你的问题无关。嗯,别介意我之前的评论。似乎
nm
的输出是变量的相对地址,而不是文档中让我相信的初始值。无法在Debian上使用gcc-5.3.1在这里复制,我在所有情况下都会得到预期的
U
。也无法复制,因为它使用了5.3.0。听起来像是上游软件包中的一个bug。
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