cmake中如何添加fPIC编译选项

16 篇文章 0 订阅
16 篇文章 0 订阅

在编译动态链接库时,需要使用-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)


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CMake是一个开源的、跨平台的自动化建构系统,它用于生成所需的构建文件(如Unix的Makefile或Windows的Visual Studio项目文件)。CMake通过使用一系列指令来描述如何生成这些文件,这些指令被称为CMakeLists.txt文件。 在CMake,`fPIC`是一个编译选项,它表示"fully-position independent code",也就是完全位置无关的代码。这种代码允许在任何位置进行代码重定位,因此,它可以被加载到内存的任何位置,而不会影响程序的运行。 当你在CMake使用`fPIC`选项时,它通常是在设置编译器的链接选项时。这意味着当你使用CMake生成构建系统(如Makefile或Visual Studio项目文件)时,你需要在这些文件指定`fPIC`作为链接选项。 具体来说,如果你正在使用g++作为你的C++编译器,并且你想生成位置无关的代码,你可能会在CMakeLists.txt文件添加如下代码: ```cmake set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") ``` 这行代码告诉编译器生成位置无关的代码。这样,当你链接库时,库的函数就可以在任何位置被调用,而不需要知道它们的具体位置。这对于动态链接库尤其重要,因为这些库的函数在运行时可能需要被调用,但你不知道它们将位于内存的哪个位置。 注意,不是所有的平台和编译器都支持`fPIC`选项。有些平台可能直接支持完全位置无关的代码,而无需任何额外的编译选项。然而,在大多数平台上,包括Linux和Windows上,你都需要使用这样的选项来生成位置无关的代码。 如果你需要更多的信息或者你有其他的问题,欢迎随时向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值