首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使64位共享的64位linux兼容库(*.so)适用于C++代码

如何使64位共享的64位linux兼容库(*.so)适用于C++代码
EN

Stack Overflow用户
提问于 2012-03-09 20:54:11
回答 1查看 2.9K关注 0票数 2

我的要求是处理一些接口.h文件。现在我的项目中有.h和.cpp/.cc文件。

我需要在linux Fedora上使用NetBeans/ Eclipse将它编译成共享的64位Linux兼容库(*.so)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-07 08:21:09

如果你从3个分别称为a.cc、b.cc和c.cc的C++源文件编译一个库;

代码语言:javascript
运行
复制
g++ -fpic -Wall -c a.cc

g++ -fpic -Wall -c b.cc

g++ -fpic -Wall -c c.cc

g++ -shared -Wl,-soname,libmylib.so.0 -o libmylib.so.0.0.0 a.o b.o c.o

然后使用ldconfig安装库,请参见

代码语言:javascript
运行
复制
man 8 ldconfig

然后,您可以编译使用库的程序,如下所示(,但请确保为添加前缀

代码语言:javascript
运行
复制
extern "C"

在源代码中包含的头文件中的类声明之前使用库。)

g++ -o myprog main.cc -lmylib

我已经用我自己的示例代码尝试了这些编译选项,并取得了成功。

基本上,Shared Libraries中涵盖的内容都适用于C++,只需用g++替换gcc即可。

所有这一切背后的理论是;

库在程序第一次加载时动态加载,这可以通过对正在运行的程序进行系统调用跟踪来确认,例如strace -o trace.txt ls,它会将程序在执行期间进行的系统调用的列表转储到名为trace.txt的文件中。在文件的顶部,您将看到该程序(在本例中为ls)确实已将所有库的内存映射到内存中。

由于库是动态加载的,因此在运行时,库代码将存在于程序的虚拟地址空间中的位置在链接时是未知的。因此,必须使用与位置无关的代码来编译库代码-因此使用了-fpic选项,该选项告诉翻译阶段生成已使用与位置无关的代码进行编码的汇编代码。如果你告诉gcc/g++在翻译阶段后停止,使用-S (大写S)选项,然后查看生成的'.s‘文件,一次使用-fpic选项,一次没有选项,你将看到区别(即动态代码有@GOTPCREL和@PLT,至少在x86_64上是这样)。

当然,必须告诉链接器将所有ELF可重定位对象类型链接到适合用作Linux共享库的可执行代码中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9634382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档