【问题标题】:Undefined Symbol when compiled with -O2 only on Mac仅在 Mac 上使用 -O2 编译时未定义的符号
【发布时间】:2009-05-05 15:07:00
【问题描述】:

我正在开发一个必须在 linux 和 mac os X 上编译的库。到目前为止,我没有遇到任何问题,使用“-g”编译在两种操作系统下都运行良好。

我尝试通过一些优化(“-O2”)进行编译,它在 linux 下运行良好,但是当我尝试在 mac os X 下将程序与我的库链接时,我得到了一个未定义的符号。

有人知道我应该寻找什么吗?

nm mylib.a | grep _the_symbol

这对于 linux 和 mac 返回相同的内容(在 linux 下没有前导下划线):

154:00000018 C _the_symbol
377:         U _the_symbol

下面是使用该库的程序在linux下的编译行:

/usr/bin/gcc  -std=c99   CMakeFiles/prod-cons.dir/prod-cons.c.o  -o prod-cons -rdynamic -L/home/claferri/dev/build/src ../src/libckaapi.a -lpthread -Wl,-rpath,/home/claferri/dev/build/src

在mac下:

/usr/bin/gcc  -std=c99 -Wl,-search_paths_first -headerpad_max_install_names -fPIC CMakeFiles/prod-cons.dir/prod-cons.c.o  -o prod-cons  -L/Volumes/Data/claferri/Work/build/src ../src/libckaapi.a /usr/lib/libpthread.dylib 

【问题讨论】:

  • 你是说 Mac 版本的 nm 会给出链接器错误,表明库包含符号?
  • 是的!我对正在发生的事情一无所知。
  • 你的源代码中是否出现“_the_symbol”,它是一个未初始化的全局变量吗?是否在您的源代码中被引用?
  • 它出现在库源代码中(但不在使用该库的程序中),它是一个未初始化的全局变量。
  • @Neil : 没关系,这个符号也出现在 linux 下(但没有前导下划线)

标签: c macos linker


【解决方案1】:

这里有一个解决方法的猜测:尝试使用 -fno-common 标志构建库。如果您对此变量有多个定义,则需要将“extern”添加到除一个之外的所有变量。

【讨论】:

  • 我多次定义了一些变量,使用 -fno-common 非常有助于看到这一点(实际上不是在我的代码部分,所以不明显)但有趣的是它不是t 最初未定义的变量...似乎现在可以使用其他变量的外部定义进行编译。谢谢!
  • 事实上,如果我删除 -fno-common,我仍然会遇到同样的错误......我不明白为什么它在 linux 上运行而不是在 mac 上运行......
  • 我的另一个想法是它可能与 *.a 存档中 *.o 文件的顺序有关。你能发布“nm -A mylib.a | grep the_symbol”的输出吗?也许在包含引用的目标文件之后移动包含定义的目标文件将有助于链接器做正确的事情。
【解决方案2】:

请注意,以下是猜测,除非/直到您提供您正在使用的确切编译器标志,否则我不能肯定地说——但 Xcode 默认设置为-fvisibility=hidden,这将隐藏几乎所有符号在你的库中,除非它被声明为可见。

你可以在 Linux 上做同样的事情,但 GCC 的默认设置是不隐藏符号。

您可以在这里找到更多信息:http://gcc.gnu.org/wiki/Visibility

【讨论】:

  • 我不使用 XCode 编译,但在两个操作系统上都使用 CMake。
猜你喜欢
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 2015-05-23
  • 2016-11-18
相关资源
最近更新 更多