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

C++ G++;以不同于共享库的方式编译.hpp和.cpp文件,c++,g++,C++,G++,我试图将一个简单函数编译成共享库对象(.so)。该函数位于名为hello.hpp的文件中: 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)。该函数位于名为hello.hpp的文件中:

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
这次,文件只有7KB。为什么仅仅因为文件名不同,g++的行为就不同?我的平台是Ubuntu 14.04和g++4.8.2。

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

根据输入文件扩展名判断,g++将创建一个


详尽阐述 如果要告诉
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++一个头文件,它会认为

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


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

为什么要在头文件中放置一个非内联自由函数定义?@zenith它不是头文件,它是一个扩展名错误的源文件。@zenith实际上我只是在库上尝试一些hello world示例。将定义放入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++