Li angle 2022-05-11 11:40 采纳率: 66.7%
浏览 182

cmake下编译的链接库undefined reference

问题遇到的现象和发生背景

因为科研,我编译了github项目seahorn,在最后一步linker的时候,出现undefined reference

运行结果及报错内容

[build] [ 98%] Built target SeaDsaAnalysis
[build] [ 98%] Linking CXX executable ../../bin/seapp
[build] ../../lib/libSeaTransformsScalar.a(PromoteVerifierCalls.cc.o): In function ‘seahorn::PromoteVerifierCalls::runOnFunction(llvm::Function&)':
[build] PromoteVerifierCalls.cc:(.text._ZN7seahorn20PromoteVerifierCalls13runOnFunctionERN4llvm8FunctionE+0x925): undefined reference to ’seahorn::isPartialFn(llvm::Function const&)'
[build] clang: error: linker command failed with exit code 1 (use -v to see invocation)
..
[build] make: *** [seapp] Error 2
[build] Build finished with exit code 2

我的解答思路和尝试过的方法

我最后链接的是可执行文件是seapp,他需要若干个静态库,其中一个就是libSeaTransformsScalar.a。文件PromoteVerifierCalls是该库中的一个,需要调用另外一个静态libSeaInstrumentation.aGeneratePartialFnPass.c文件,未定义的函数isPartialFn就在GeneratePartialFnPass中。

其中,另外一个可执行文件seahorn也是如此配置(依赖相同的静态库),他就可以成功链接(没有调用到函数isPartialFn)。
还有一个奇怪的现象,我使用nm fine.a查看库的接口,出现了许多奇怪的信息。如下
运行 nm libSeaInstrumentation

...
GeneratePartialFnPass.cc.o:
0000000000000000 V _ZN4llvm30VerifyDisableABIBreakingChecksE
0000000000000000 T _ZN4llvm35initializeGeneratePartialFnPassPassERNS_12PassRegistryE
0000000000000000 W _ZN4llvm4Pass14doFinalizationERNS_6ModuleE
0000000000000000 W _ZN4llvm4Pass16doInitializationERNS_6ModuleE
0000000000000000 W _ZN4llvm8CallInst6CreateEPNS_12FunctionTypeEPNS_5ValueENS_8ArrayRefIS4_EENS5_INS_17OperandBundleDefTIS4_EEEERKNS_5TwineEPNS_11InstructionE

自信看,出现了很多前缀。
我查看别的项目的lib,人家就是这样的

free_var_collector.o:
                 U _GLOBAL_OFFSET_TABLE_
                 U alloc_pstack_array
0000000000000b50 T cleanup_fvar_collector
00000000000000c0 T delete_fvar_collector
                 U delete_harray_store
                 U delete_pstack
                 U delete_ptr_hmap
                 U free_pstack_array
0000000000000020 t fvar_dead_harray
0000000000000000 t fvar_dead_hmap_pair
0000000000000100 T get_free_vars_of_term
                 U harray_remove_elem
0000000000000090 T init_fvar_collector

我的问题出在哪里了?
附件
seapp 的CMakeLists.txt

set (USED_LIBS 
  SeaInstrumentation      被引用的库
  SeaTransformsScalar  这里出问题了
  SeaTransformsUtils
  SeaAnalysis
  SeaSmt
  ${SEA_DSA_LIBS}  
  SeaSupport
  ${LLVM_SEAHORN_LIBS}
  ${Boost_SYSTEM_LIBRARY}
  SeaLlvmIpo
  ${GMP_LIB}
  ${RT_LIB}
  )

set(LLVM_LINK_COMPONENTS
  BitWriter
  IRReader
  IPO
  ScalarOpts
  Instrumentation 
  Core 
  # XXX not clear why these last two are required
  CodeGen
  ObjCARCOpts)
  
add_llvm_executable(seapp DISABLE_LLVM_LINK_LLVM_DYLIB seapp.cc)
target_link_libraries (seapp PRIVATE ${USED_LIBS})
llvm_config (seapp ${LLVM_LINK_COMPONENTS})
install(TARGETS seapp RUNTIME DESTINATION bin)

if (SEAHORN_STATIC_EXE)
  set (CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++")
  set_target_properties (seapp PROPERTIES LINK_SEARCH_START_STATIC ON)
  set_target_properties (seapp PROPERTIES LINK_SEARCH_END_STATIC ON)
endif()

编辑libSeaTransformsScalar的CMakeLists.txt

add_llvm_library (SeaTransformsScalar DISABLE_LLVM_LINK_LLVM_DYLIB
  ..
  LowerLibCxxAbiFunctions.cc
  PromoteVerifierCalls.cc 这个文件中引用了isPartialFn
  CutLoops.cc
  PromoteMalloc.cc
  ..
  )

被引用的SeaInstrumentation 的CMakeLists.txt

add_llvm_library(SeaInstrumentation DISABLE_LLVM_LINK_LLVM_DYLIB 
  ...
  BranchSentinelPass.cc
  GeneratePartialFnPass.cc 这里定义了isPartialFn
  )
  • 写回答

1条回答 默认 最新

  • 柒号华仔 2022年度博客之星评选前沿技术领域TOP 1 2022-05-11 12:31
    关注

    你的库有前缀是因为函数重载,用g++编译时,符号表中除了函数名,还有返回类型和参数类型;而别人的库是gcc编译的,C语言没有函数重载,符号表中只有函数名。你在调别人的头文件时,加上extern "C"试试。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月11日

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题