我的要求是处理一些接口.h文件。现在我的项目中有.h和.cpp/.cc文件。
我需要在linux Fedora上使用NetBeans/ Eclipse将它编译成共享的64位Linux兼容库(*.so)。
发布于 2012-04-07 00:21:09
如果你从3个分别称为a.cc、b.cc和c.cc的C++源文件编译一个库;
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安装库,请参见
man 8 ldconfig
然后,您可以编译使用库的程序,如下所示(,但请确保为添加前缀
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共享库的可执行代码中。
https://stackoverflow.com/questions/9634382
复制