G++编译.hpp和.cpp文件的方式与共享库不同
G++ compiles .hpp and .cpp files differently to shared library
我试图将一个简单的函数编译成共享库对象(.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++一个头文件,它会认为
嗯?这是一个标题。你不编译头,它们不包含代码——嗯,可能程序员想在很多地方使用这个头,所以他让我预先解析它,并生成一个快速阅读的语法树
正如您所看到的,所得到的预编译头是一个相当大的结构。
相关文章:
- 在c代码之间共享数据的最佳方式
- DLL共享数据的推荐方式是什么
- 在C++中共享键值对的最佳方式
- 以编程方式获取 Samba 共享卷 ID
- 如何以编程方式查找加载的共享库的版本?
- 模板类静态在最终二进制文件中跨共享库以不同方式实例化是否一致
- RedHatLinux :是否可以以编程方式加载 libcert.so 共享对象
- 找到组合对之间共享元素的最佳方式
- Eclipse,构建共享库的最佳方式
- iOS和Android之间共享代码的最佳方式
- G++编译.hpp和.cpp文件的方式与共享库不同
- 跨容器共享对象的最佳方式是什么?
- 以编程方式在非 Windows 计算机中创建共享文件夹
- 为什么 GNU ld 在链接可执行文件和共享对象时以不同的方式解析符号
- 分发C++共享库的头文件的最佳方式是什么?
- 从python中的共享对象调用C++函数的最佳方式
- 通过运行应用程序以程序方式确定正在使用的共享库
- C++更喜欢在同一类中的方法之间共享对象的方式
- 为渲染对象的所有实例维护一个指向共享纹理/资源的指针/引用的最佳方式
- ALSA:以共享方式打开PCM设备