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

G++ compiles .hpp and .cpp files differently to shared library

本文关键字:共享 方式 hpp 编译 cpp 文件 G++      更新时间:2023-10-16

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

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

我使用:

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

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

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

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

简介

即使您指定输出应具有.so作为其扩展名,也不会使用下面的命令生成典型的对象文件

根据输入的文件扩展名判断,g++将创建一个预编译的头。

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

精化

如果要告诉g++hello.hpp视为cpp-文件,可以通过指定-x的显式类型来实现。

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

原因很简单: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++一个头文件,它会认为

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

正如您所看到的,所得到的预编译头是一个相当大的结构。