使用`g ++ -std = c ++ 1y`编译的目标文件不会链接

时间:2016-06-13 14:19:58

标签: c++ c++11 gcc

我在Linux上使用g++ 5.3.0

我以为我自己会成为一个目标文件,在链接时会初始化全局变量ArgcArgv,以便在整个过程中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符号,而其他两个生成(因为它们应该?)未定义的引用?这是一个错误吗?

0 个答案:

没有答案