`
Jameslyy
  • 浏览: 408938 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

g++ 编译共享库

阅读更多

 测试jni时,遇到一个问题,在mac上执行如下命令编译c程序,可以正常通过编译。

inc='-I /usr/lib/jvm/jdk1.8.0_20/include -I /usr/lib/jvm/jdk1.8.0_20/include/linux'
g++ -shared $inc jni_helloworldImpl.cpp  -o Hello.so

 

但是在Ubuntu上时遇到编译无法通过:提示加-fPIC重新编译

 

 /usr/bin/ld: /tmp/ccxHy6dg.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

 

经查,-fPIC参数用来声明编译出来的链接库的代码段是可以共享的,-shared参数用来声明把代码编译为共享库。

加上 -fPIC 参数,代码可以正常编译,不知为何mac不需要这个参数。

 

 

 

 

分享到:
评论

相关推荐

    QNX系统中添加自己编译的.so库.zip_QNX .so文件_SO打包_qnx文件_qnx系统g++编译_so库

    3. **编译对象文件**:使用g++编译源代码,生成.o(目标文件)。命令通常为: ``` g++ -c -Wall -fPIC -I包含路径 源文件.cpp ``` 其中,-fPIC表示生成位置独立代码,这对于动态库是必需的。 4. **创建共享库**...

    linix下的动态库调用---g++

    使用g++编译为对象文件: ```bash g++ -c -fPIC math.cpp -o math.o ``` 这里,`-c`参数表示编译但不链接,`-fPIC`表示生成位置独立代码,这是创建共享库的必要选项。 接下来,我们将对象文件链接为动态库: ```...

    Linux编译动态库和静态库

    动态库允许多个程序共享同一份代码,节省内存资源,而静态库则将库代码直接编译进目标程序,不依赖外部环境。本篇将详细介绍在Linux环境下如何编译动态库和静态库。 首先,我们来看动态库的生成过程。动态库的编译...

    opencv4.4.0交叉编译好的动态库和静态库.rar

    动态库在程序运行时被加载到内存中,多个程序可以共享同一份库,节省内存资源,但需要目标系统已安装相应的库。静态库则在编译时会将库代码合并到可执行文件中,不依赖运行时环境,但生成的文件通常较大。 在这个...

    需链接动态库静态库,且需先编译库的makefile

    动态库(也称为共享库)和静态库是两种主要的链接类型。本示例聚焦于如何在`makefile`中处理这两种库的链接,这对于理解和创建复杂项目构建过程至关重要。 `makefile`是用于自动化构建项目的工具,它定义了规则来...

    GCC静态库和共享库的生成及调用

    共享库是在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。一个共享库有可能被多个应用程序共享,因此,对每个应用程序来说,即使不再使用某个共享库,也不应将其删除。 创建共享库的命令为: `$...

    yaml-cpp库的编译&安装

    这里我们开启共享库的编译选项,因为很多项目倾向于使用动态链接库以减少可执行文件的大小: ```bash cmake -DYAML_BUILD_SHARED_LIBS=on .. ``` 4. **编译源代码**: ```bash make ``` 这一步会根据cmake的...

    AndroidStudio中使用NDK编译器笔记

    这段代码定义了一个名为`native-lib`的共享库,包含了`src/main/cpp/native-lib.cpp`的源代码,并链接了Android的日志库(`log-lib`)和Android库(`android-lib`)。 在完成这些设置后,你可以使用`Build` -> `...

    libredwg qt creator交叉编译,安卓平台,共享库 armeabi-v7a

    本话题聚焦于使用Qt Creator进行跨平台编译,具体目标是将libredwg库编译为适用于Android平台的armeabi-v7a架构的共享库。libredwg是一个开源项目,提供了读取和写入DWG文件的能力,这对于图形设计、CAD应用或者其他...

    Linux代码,以C++为基础.rar

    g++编译选项 -fPIC,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,这正是共享库所要求的 -shared,表明产生共享库 -lpthread,多线程使用,lpthread...

    linux 编译静态库的例子

    动态库则可以节省磁盘空间,多个程序可以共享同一库,但需要运行环境有相应的库文件。 在这个例子中,我们有一个名为`demo3`的项目,它可能包含了一系列源代码文件和一个`Makefile`。`Makefile`是用于自动化构建...

    Linux GCC&&G++编译器与调试器1

    - `-shared`:创建共享库。 **GCC/G++的编译过程** 编译过程包括四个阶段: 1. **预处理**:处理`#include`,宏替换等预处理指令,生成.i文件。 2. **编译**:将预处理后的代码转换成汇编代码(.s)。 3. **汇编**:...

    C/C++静态库和动态库的编译

    在C/C++编程中,库是预编译的代码片段,可以被多个程序共享,以减少重复工作并提高效率。库分为两种主要类型:静态库(.a或.lib)和动态库(.so或.dll)。本资源包含了这两种库的编译源码,旨在帮助开发者理解和实践...

    linux下生成和调用SO库文件的程序示例

    在Linux操作系统中,动态链接库(Shared Object,简称SO)是一种可被多个程序共享的代码库,它能够减少内存占用并提高系统效率。本示例将深入探讨如何生成SO库文件以及如何在程序中调用这些库。我们将分为以下几个...

    Linux C++编译及 静态/动态 链接库 笔记

    这篇笔记主要探讨了在Linux环境下如何编译C++程序以及如何处理静态和动态链接库。以下是对这些知识点的详细说明: 1. **C++编译过程**: - C++程序的编译通常包括预处理、编译、汇编和链接四个步骤。预处理阶段...

    windows下用MinGW编译ffmpeg+x265库

    需要下载x264的源码并解压,之后通过配置命令指定库的安装目录,并启用共享库和静态库的编译。编译过程可能需要几分钟,并且在没有错误的情况下,可以执行make install命令。 接下来,编译x265库的过程类似,但需要...

    VELT共享库示例

    3. **C++共享库的创建**:理解如何定义C++接口(头文件),实现库功能(源文件),以及如何使用g++或clang等编译器编译生成.so(共享对象)文件。 4. **链接库的使用**:学习如何在Linux应用程序中使用`-l`和`-L`...

    emule 编译需要的库文件

    5. **编译源代码**:运行编译命令,如`make`或`g++ main.cpp -o emule ...`,这将编译源代码并链接所需库。 6. **解决依赖问题**:如果遇到编译错误或链接错误,检查是否缺少其他依赖库或库版本不匹配,根据需要...

    gcc g++离线安装包免费下载

    5. `libstdc++-4.8.5-44.el7.x86_64.rpm`:这是C++标准库的运行时库,包含了C++程序运行所需的共享库。 6. `libgomp-4.8.5-44.el7.x86_64.rpm`:这是GNU OpenMP库的RPM包,OpenMP是一个并行编程模型,用于多核或多...

    centos系统gcc g++离线安装包

    G++是GCC的一部分,专门用于C++编程,它提供了C++的编译、链接以及优化等功能。在CentOS系统上安装GCC和G++,通常需要访问在线仓库,但由于离线安装的需求,我们需要提前下载所需的RPM包或者源代码。 离线安装GCC和...

Global site tag (gtag.js) - Google Analytics