G ++以不同的方式编译.hpp和.cpp文件到共享库

时间:2015-03-22 11:25:12

标签: c++ g++

我试图将一个简单的函数编译成共享库对象(.so)。该函数位于名为hello.hpp的文件中:

const char* greet(){
  return "hello world";
}

我用:

g++ -shared -fpic hello.hpp -o hello.so

然后它创建一个大小为1.8 MB的hello.so文件。我发现大小不合理,我试图将源文件重命名为hello.cpp而不更改其内容。然后我再次编译:

g++ -shared -fpic hello.cpp -o hello.so

这次,文件只有7 KB。为什么g ++的行为不同只是因为文件名不同?我的平台是Ubuntu 14.04和g ++ 4.8.2。

2 个答案:

答案 0 :(得分:5)

简介

即使您指定输出的扩展名为.so,您也不能使用以下命令制作典型的目标文件

g++,从输入文件扩展名判断,将创建precompiled header

g++ -shared -fpic hello.hpp -o hello.so

精化

如果您想告诉g++hello.hpp视为 cpp - 文件,您可以通过将显式类型指定为{{1 }}

-x

答案 1 :(得分:1)

原因很简单:g++根据输入文件名决定您想要的输出类型(您没有真正指定; --shared不做即):

我已经采取了你的榜样并做了同样的事情:

$> ls -l cpp/ hpp/
cpp:
total 12K
-rwxr-xr-x. 1 marcus marcus 7.8K Mar 22 12:27 hello.so
-rw-r--r--. 1 marcus marcus   48 Mar 22 12:26 libtest.cpp

hpp:
total 1.9M
-rw-r--r--. 1 marcus marcus 1.9M Mar 22 12:27 hello.so
-rw-r--r--. 1 marcus marcus   48 Mar 22 12:26 libtest.hpp

不同之处在于生成的文件类型:

$>file {c,h}pp/hello.so
cpp/hello.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=7a74d02c517bbb196fb8e517e85a0bba6349020d, not stripped
hpp/hello.so: GCC precompiled header (version 014) for C++

如果你只给g ++一个头文件,它会想到

  

是吗?这是一个标题。你没有编译标题,它们不包含代码 - 嗯,程序员可能想在很多地方使用这个标题,所以他要求我预先解析它并生成一个快速的-read语法树

如您所见,生成的预编译头是一个相当大的结构。