g++ 编译共享库

本文探讨了在Mac和Ubuntu平台上使用JNI进行跨平台编译时遇到的问题。具体讨论了-fPIC参数的作用及其在不同平台上的必要性。

 测试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不需要这个参数。

 

 

 

 

### 使用 g++ 编译 32-bit 的 .so 文件 为了创建一个适用于 Linux 系统的 32 位共享对象 (.so) 文件,需要确保编译器和链接器设置正确。以下是具体方法: #### 设置目标架构为 i386 首先,在命令行中指定目标架构为 32 位 (i386),这可以通过 `-m32` 参数完成。 ```bash export CXXFLAGS="-m32" export LDFLAGS="-m32" ``` 这些环境变量会告诉 `g++` 和其他工具链组件生成针对 32 位系统的二进制文件[^1]。 #### 创建 Makefile 或者直接编写命令 如果项目规模较小,则可以直接在终端运行完整的编译指令;对于大型项目建议维护一份合适的 Makefile 来管理构建过程。下面是一个简单的例子说明如何手动执行此操作: ```cpp // example.cpp extern "C" int add(int a, int b){ return a + b; } ``` ```bash g++ -o libexample.so -m32 example.cpp ``` 这里的关键参数解释如下: - `-fPIC`: 表示位置无关代码(Position Independent Code), 是创建动态库所必需的; - `-shared`: 告诉编译器我们正在制作一个共享库而不是可执行文件; - `-m32`: 如前所述,用于指示输出 32 位版本的目标文件。 当涉及到更复杂的多文件项目时,应该考虑使用 Makefile 进行自动化构建,并且可以在其中加入调试信息支持以便后续可能需要用到 GDB 调试工具[^2]: ```makefile CXX=g++ CXXFLAGS=-O2 -m32 -g LDFLAGS=-m32 TARGET=libexample.so SRCS=$(wildcard *.cpp) all: $(TARGET) $(TARGET): $(OBJS) $(CXX) -shared $^ -o $@ $(LDFLAGS) clean: rm -rf *.o $(TARGET) ``` 请注意,由于 Windows 不原生支持 `.so` 文件格式,因此上述指导主要面向类 Unix 操作系统如 Ubuntu。若需跨平台移植至 Win10,请先确认已安装相应的交叉编译环境并调整路径配置[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值