代码之家  ›  专栏  ›  技术社区  ›  claf

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

  •  1
  • claf  · 技术社区  · 15 年前

    我正在开发一个必须在linux和MacOSX上编译的库,到目前为止,我没有遇到任何问题,用“-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 回复  |  直到 15 年前
        1
  •  1
  •   Lance Richardson    15 年前

    这里有一个解决方法:尝试使用-fno common标志来构建库。如果这个变量有多个定义,那么除了一个外,还需要添加“extern”。

        2
  •  0
  •   unwesenunwesen    15 年前

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

    在Linux上也可以这样做,但是GCC的默认设置是不隐藏符号。

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