news 2026/8/28 19:26:26

CMake基础: 全局变量CMAKE_POSITION_INDEPENDENT_CODE

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CMake基础: 全局变量CMAKE_POSITION_INDEPENDENT_CODE

目录

1.简介

2.CMake 配置方式

3.注意事项

4.与 BUILD_SHARED_LIBS 的关系


1.简介

这是 CMake全局变量,用来统一控制是否默认生成位置无关代码(-fPIC)。这是构建共享库 (Shared Libraries, .so/.dll)的必要条件。

核心作用:

  • 生成位置无关代码:代码中不使用绝对地址,而是通过相对寻址或全局偏移表 (GOT) 来访问数据和函数。
  • 支持动态加载:只有启用 PIC 的代码才能被动态链接器加载到内存的任意位置,这是实现共享库和可执行文件灵活加载的基础。

2.CMake 配置方式

1.全局配置 (推荐)

为项目中所有目标设置 PIC 属性:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

2.单个目标配置

为特定库 / 可执行文件单独设置:

add_library(my_shared_lib SHARED src/library.cpp) # 显式为该目标开启 PIC set_target_properties(my_shared_lib PROPERTIES POSITION_INDEPENDENT_CODE ON )

3.条件编译

根据平台或构建类型条件开启:

if (UNIX AND BUILD_SHARED_LIBS) set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif()

3.注意事项

  • 共享库默认开启:当使用add_library(... SHARED)时,CMake 会自动为你设置POSITION_INDEPENDENT_CODEON,通常无需手动干预。
  • 静态库与 PIC:虽然静态库 (.a/.lib) 通常不需要 PIC,但如果它未来会被链接到共享库中,建议也为其开启 PIC,以避免潜在的链接错误。
  • 平台差异
    • Linux/macOS:构建共享库强烈要求 PIC,否则会报错。
    • Windows:DLL 本身不依赖-fPIC编译选项(其机制不同),但 CMake 仍支持该属性以保持跨平台兼容性。

4.与BUILD_SHARED_LIBS的关系

当你设置set(BUILD_SHARED_LIBS ON)时,所有通过add_library创建的库默认都会构建为共享库,并自动启用 PIC 特性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 18:55:26

AAAI 2026 Oral|论文解读:针对LLM外部推理的因果奖励调整方法

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入!点击阅读原文查看作者讲解近日,实验室研究团队的论文“Causal Reward Adjustment: Mitigating Reward Hacking in External Reasoning via Backdoor Correction”被人工智能会议大会(The 40…

作者头像 李华
网站建设 2026/8/28 14:53:42

详解iOS应用上架App Store的五个步骤及注意事项

相比安卓的应用商店,App store的上架流程更为繁琐,要求也更加严格。从步骤上来看,整体我们划分为五个步骤,如下: 1.申请开发者账号 2.创建APP ID以及申请证书 3.在开发者中心的iTunes Connect 中配置 App 相关信息 4.打…

作者头像 李华
网站建设 2026/8/19 21:30:43

2015-2025年政府公共安全基础设施建设采购数据库

梁平汉、张艺川和郭宇辰(2025)的研究总结,以视频安全设备为主的公共安全基础设施建设有助于促进居民服务消费,因其有助于减少犯罪、改善治安,同时增强居民的安全感知,从而在此类保障下居民更有意愿消费&…

作者头像 李华