生成动态库: 需要的目标文件得用-fPIC选项生成.

而静态库所需的目标文件可以不用-fPIC选项.

例:
复制代码 代码如下:
/////// static.h

void static_print();

///////static.cpp

#include <iostream>

#include "static.h"

void static_print() {

     std::cout<<"This is static_print function"<<std::endl;

}

////// shared.h

void shared_print();

////// shared.cpp

#include <iostream>

#include "shared.h"

#include "static.h"

void shared_print() {

       std::cout<<"This is shared_print function";

        static_print();

}

////////test.cpp

   #include "share.h"

int main()
{
       shared_print();
       return 0;
   }

方法一:

静态库的.o文件也用-fPIC生成. 生成动态库时把静态库加入.

 生成应用程序时只加载动态库

复制代码 代码如下:
 g++ -c -fPIC static.cpp // 生成static.o

 ar -r libstatic.a static.o // 生成静态库libstatic.a

 g++ -c -fPIC shared.cpp // 生成shared.o

 g++ -shared shared.o -lstatic -o libshared.so   // 生成动态库libshared.so 注: -shared是g++的选项,与shared.o无关. -lstatic选项把libstatic.a的函数加入动态库中.

 g++ test.cpp -lshared -o test.exe // link libshared.so 到test.exe中.
 

方法二:

 静态库的.o文件不用-fPIC生成. 生成动态库时不加表态库.

生成应用程序时加载动态库和静态库.

复制代码 代码如下:
 g++ -c static.cpp // 生成static.o

 ar -r libstatic.a static.o // 生成静态库libstatic.a

 g++ -c -fPIC shared.cpp // 生成shared.o

 g++ -shared shared.o -o libshared.so // 生成动态库libshared.so 注: -shared是g++的选项,与shared.o无关. 这时如果加-lstatic. error:relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

 g++ test.cpp -lshared -lstatic -o test.exe // link libshared.so 到test.exe中.
 

两种方法的不同之处在于static_print的实际代码一个在.so中.一个在最后test.exe文件中. 个人觉得第一种方法更好, 因为动态库应该看成一个可以独立运行的程序.

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!

RTX 5090要首发 性能要翻倍!三星展示GDDR7显存

三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。

首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。

据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。