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

ENI*_*GMA 2 c++ g++

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

const char* greet(){
  return "hello world";
}
Run Code Online (Sandbox Code Playgroud)

我用:

g++ -shared -fpic hello.hpp -o hello.so
Run Code Online (Sandbox Code Playgroud)

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

g++ -shared -fpic hello.cpp -o hello.so
Run Code Online (Sandbox Code Playgroud)

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

Fil*_*efp 5

介绍

即使您指定输出应具有.so其扩展名,您也不​​会使用以下命令创建典型的目标文件.

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

g++ -shared -fpic hello.hpp -o hello.so
Run Code Online (Sandbox Code Playgroud)

如果你想告诉g++对待hello.hpp,如果它真的是一个CPP -file,您可以通过指定显式类型这样做-x.

g++ -shared -fpic -x c++ hello.hpp -o hello.so
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释和解决方案! (2认同)