Я пытаюсь скомпилировать простой код с использованием библиотек libav.
// Some simple code to demonstrate
#include <libavformat/avformat.h>
int main(int argc, char *argv[]) {
av_register_all();
return 0;
}
Я на Mac, с gcc версии 4.2.1.
Когда я пытаюсь скомпилировать код как C, используя
gcc -o main main.c -lavformat
тогда код компилируется и ссылки нормально. Тем не менее, когда я пытаюсь скомпилировать его как C ++, используя
g++ -o main main.cpp -lavformat
это дает мне неопределенные символы ошибок:
Undefined symbols for architecture x86_64:
"av_register_all()", referenced from:
_main in ccQ23HMe.o
Когда я бегу с -v
Опция, выполняющая шаги связывания:
// gcc
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o c
/var/folders/r0/n22t1hyn7ts92jxgd9_pn8yw0000gn/T/main-uUfZkM.o -lavformat
-lSystem /usr/bin/../lib/clang/4.1/lib/darwin/libclang_rt.osx.a
// g++
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o c
/var/folders/r0/n22t1hyn7ts92jxgd9_pn8yw0000gn/T/main-5QU6fj.o -lavformat
-lstdc++ -lSystem /usr/bin/../lib/clang/4.1/lib/darwin/libclang_rt.osx.a
Здесь единственная разница заключается в добавлении -lstdc++
на связывание.
Почему появляются эти неопределенные символьные ошибки? Есть ли какая-то причина, по которой простое добавление библиотеки к связыванию приведет к появлению этих неопределенных символов? Или есть что-то еще, что вызывает эту проблему, возможно, конкретно связано с libavformat?
libav Список часто задаваемых вопросов покрывает это точный сценарий!
Здесь единственным отличием является добавление -lstdc ++ к линковке.
Нет, это так, и вы используете другой язык с другими соглашениями о вызовах по умолчанию.
av_register_all
как заявлено в шапке не помечено extern "C"
тогда как для определения в фактической скомпилированной библиотеке требуется старое доброе соглашение о вызовах языка Си.
Окружи свой libav включает в себя с extern "C"
,
Других решений пока нет …