You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免CMake将目标文件的绝对路径写入静态库?

问题描述

构建tcmalloc_minimal_static.lib静态库后,库内部包含完整绝对路径的目录结构,导致objcopy.exe无法正常读取该库。

异常库结构

用7z打开生成的tcmalloc_minimal_static.lib,可见如下不合理的内部结构:

tcmalloc_minimal_static.lib
 - F:/
   - *full/path/to/my/project/*
     - build/Release/
       - _deps/
         - gperftools-build/
           - tcmalloc_minimal_internal_object.dir/
              - Release/
                - central_freelist.obj
                - ...
           - windows_object.dir/
              - Release/
                - ia32_modrm_map.obj
                - ...
 - tcmalloc_minimal_static.dir/
   - Release/
     - central_freelist.obj
     - ...
 - 1.txt
 - 2.txt

相关CMake构建代码片段

构建使用的关键CMake逻辑如下:

# Windows平台对象库定义
if(MINGW OR MSVC)
  set(WINDOWS_INCLUDES
#       ...
          src/windows/preamble_patcher.h)
  set(libwindows_la_SOURCES ${WINDOWS_INCLUDES}
#       ...
          src/windows/preamble_patcher_with_stub.cc)
  add_library(windows_object OBJECT ${libwindows_la_SOURCES})
  add_library(windows INTERFACE)
  target_sources(windows INTERFACE $<TARGET_OBJECTS:windows_object>)
  # patch_functions.cc uses Psapi.lib.  MSVC has a #pragma for that, but not us.
  target_link_libraries(windows INTERFACE psapi)
#...

# tcmalloc_minimal内部对象库定义
set(libtcmalloc_minimal_internal_la_SOURCES src/common.cc
#       ...
        ${TCMALLOC_MINIMAL_INCLUDES})
add_library(tcmalloc_minimal_internal_object OBJECT ${libtcmalloc_minimal_internal_la_SOURCES})
# We #define NO_TCMALLOC_SAMPLES, since sampling is turned off for _minimal.
target_compile_definitions(tcmalloc_minimal_internal_object PRIVATE NO_TCMALLOC_SAMPLES NO_HEAP_CHECK NDEBUG)
add_library(tcmalloc_minimal_internal INTERFACE)
target_link_libraries(tcmalloc_minimal_internal INTERFACE ${LIBSPINLOCK} ${maybe_threads_lib})
target_sources(tcmalloc_minimal_internal INTERFACE $<TARGET_OBJECTS:tcmalloc_minimal_internal_object>)
#...

# 静态库构建逻辑
if(GPERFTOOLS_BUILD_STATIC)
    add_library(tcmalloc_minimal_static STATIC ${libtcmalloc_minimal_internal_la_SOURCES})
    target_compile_definitions(tcmalloc_minimal_static PRIVATE NO_TCMALLOC_SAMPLES NDEBUG)
    target_link_libraries(tcmalloc_minimal_static PRIVATE tcmalloc_minimal_internal Threads::Threads)
    if(MINGW)
      target_link_libraries(tcmalloc_minimal_static PRIVATE stacktrace)
    endif()
    if(NOT MSVC)
      set_target_properties(tcmalloc_minimal_static PROPERTIES
              OUTPUT_NAME tcmalloc_minimal)
    endif()
    weaken_object(tcmalloc_minimal_static)
    install(TARGETS tcmalloc_minimal_static)
endif()

已尝试的无效方案

  • 在CMake启动参数中添加-DCMAKE_SKIP_RPATH,无效果(该参数多用于共享库路径问题,不适用于当前静态库场景)

需求

移除静态库中的长绝对路径,使objcopy.exe能够正常读取该库。

内容的提问来源于stack exchange,提问作者Duke M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:23:20