如何避免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
相关产品推荐
相关产品推荐

