Неопределенный символ при компиляции с -O2 только на Mac - PullRequest
1 голос
/ 05 мая 2009

Я работаю над библиотекой, которая должна компилироваться в 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 ]

1 голос
/ 05 мая 2009

Вот предположение об обходном пути: попробуйте собрать библиотеку с флагом -fno-common. Если у вас есть несколько определений этой переменной, вам нужно добавить «extern» ко всем, кроме одного.

0 голосов
/ 05 мая 2009

Обратите внимание, что следующее является предположением, и я не могу сказать наверняка, если / пока вы не предоставите точные флаги компилятора, которые вы используете - но Xcode по умолчанию устанавливает -fvisibility=hidden, что скрыло бы практически любой символ в вашей библиотеке, если она не объявлена ​​как видимая.

Вы можете сделать то же самое в Linux, но GCC по умолчанию не скрывает символы.

Вы найдете больше информации здесь: http://gcc.gnu.org/wiki/Visibility

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...