У меня возникла проблема с связыванием моей общей библиотеки с статической библиотекой OpenDDS (v3.9), потому что я не могу найти, где находится эта подпись метода.В какой библиотеке в OpenDDS содержится «OpenDDS :: DCPS :: operator <<"?
Вот ошибка.
[exec] libs/mylib/ABTypeSupportImpl.cpp:74: error: undefined reference to 'OpenDDS::DCPS::operator<<(OpenDDS::DCPS::Serializer&, short)'
[exec] collect2: error: ld returned 1 exit status
[exec] make: *** [/tmp/mybuild/lib_ab/obj/local/armeabi-v7a/lib_ab.so] Error 1
ABTypeSupportImpl.cpp автоматически генерируется при компиляции IDL. Далее происходят те же ошибки. Из-за пространства имен (OpenDDS :: DCPS) я бы подумал, что это будет найдено в библиотеке libOpenDDS_Dcps.a, но использование nm в этом lib, а затем grep'ing для «operator» или «< <», не дает никаких результатов. Может ли быть, что название mangling немного странно для перегруженных операторов? Я запускал это в каждом файле библиотеки в $ DDS_ROOT/lib, но ничего не нашел.
И если я перекомпиляю IDL и удаляю поля-члены структур с такими типами данных, как короткие или длинные, тогда нет ошибок и все ссылки в порядке.
Кто-нибудь знает, в какой библиотеке может быть найден этот метод?
Говорить о моей программе в строке или нет, я думаю, это внутренняя оптимизация, которую компилятор может или не хочет делать. По крайней мере, это мое понимание. Я не отключаю ничего в своем компиляторе. Я пробовал разные флаги. – Ender
Кроме того, я испробовал опции оптимизации GCC с 01 и выше, которые, похоже, делают немного для встроенных функций, но все равно не идут. – Ender
В OpenDDS (и ACE) используется определение, чтобы включить или отключить встроенные методы, это функция на уровне кода для использования вложения или нет. Попытайтесь добавить __ACE_INLINE__ или ACE_NO_INLINE в компилятор, который определяет при компиляции вашего кода, проверьте свою компиляцию OpenDDS, которая использовалась при компиляции OpenDDS –