仅在Mac上使用-O2编译时未定义的符号

时间:2009-05-05 15:07:01

标签: c macos linker

我正在开发一个必须在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 

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

您可以在Linux上执行相同的操作,但GCC的默认设置是不隐藏符号。

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