【问题标题】:Resolving undefined symbols in .so that are defined in header解析.so中未定义的符号,这些符号在标题中定义
【发布时间】:2017-03-06 16:53:00
【问题描述】:
+-CMakeLists.txt
 | 
 +---Dir1
   |- source_file1.c
   |- CMakeLists.txt
 +---Dir2
   |- source_file2.c
   |- CMakeLists.txt
 +---Dir3
   |- header_file.h

我有一个使用 cmake 创建的共享库 abc.so

这个库有 2 个未定义的名称:

U do_something1
U do_something2

这两者都在不同目录中的 Headerfile.h 中定义。该文件是 source_file1.c 和 source_file2.c 的 SOURCE_FILE 的一部分

但是我无法在库中解析未定义的符号!这太奇怪了。我做错了什么?

使用 -fPIC -rdynamic 编译代码。 由于某种原因 -Wl --export-all-symbols 出现编译器无法识别。编译器是 gcc 5.4.0

【问题讨论】:

  • both of which are defined in a Headerfile.h - dynamic 符号很少在 header 文件中定义。如果函数在头文件中定义,它通常使用static inline 说明符。那么,在header_file.h 中定义符号对您意味着什么?
  • 这两个函数是内联函数。我看到所有其他非内联函数都在 .so 中正确定义。我如何解决它?我不想让它们内联。添加静态内联说明符会修复它吗?
  • 我删除了内联函数,现在直接用代码替换它。所以不能立即尝试。
  • 如果source_file1.c 包含header_file.h,将do_something1 函数定义为static inline,则该函数对于生成的库不应是“未知”的。

标签: cmake shared-libraries


【解决方案1】:

一个。将内联函数声明为静态解决了该问题。 湾。如果c文件包含带有静态内联的标题就足够了

谢谢 (@Tsyvarev)

【讨论】:

    猜你喜欢
    • 2022-10-25
    • 2014-10-29
    • 1970-01-01
    • 2014-10-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多