我试图将一个简单的函数编译成共享库对象(.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。
答案 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语法树
如您所见,生成的预编译头是一个相当大的结构。