cmake中如何添加fPIC编译选项

在编译动态链接库时,需要使用-fPIC(Position Independent Code)编译选项,因为动态链接库会在运行时加载到内存中,并与其他共享库一起链接,所以需要确保动态链接库中的代码可以被加载到任意内存地址而不会产生副作用。

对于静态链接库或可执行文件,不需要使用-fPIC选项,因为它们不会被动态加载,并且可以在链接时使用绝对地址。使用-fPIC选项会增加代码的开销,并可能导致性能下降,因此只应该在编译动态链接库时使用它。

需要注意的是,在某些情况下,即使编译动态链接库时也不需要使用-fPIC选项。例如,如果动态链接库只会在一个特定的地址空间中使用,可以使用-fno-PIC选项来禁用位置无关代码,并允许编译器使用更有效的代码生成策略。但是,这种情况是比较少见的,大多数情况下都需要使用-fPIC选项。
CMakeLists.txt中有三种添加方式:

cmake_minimum_required(VERSION 3.22.0)

# 第一种方式,一定要加在target生成之前,这种,这种方式是集成的,后面的所有target,所有C还是C++都会继承这个属性
add_compile_options(-fPIC)

# 第二种,必须放在targe生成之前才有效果
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

# target生成的位置
add_library(z_a a.cpp)

# 第三种方式,单独设置C++或者C的FLAGS,这样设置的话,只针对C++或者C有效,相对比较推荐这种。
# 并且位置可以在target生成的前面,也可以放在target生成的后面,都行
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -fPIC")

# 第四种,设置属性的方式,由于是设置target的属性,所以必须放在target生成之后
set_target_properties(z_a PROPERTIES POSITION_INDEPENDENT_CODE ON)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值