[devel] g++ -- inline не inline

Ivan A. Melnikov ivan.a.melnikov на gmail.com
Ср Мар 22 14:22:19 MSK 2017


2017-03-22 14:01 GMT+04:00 Денис Смирнов <mithraen на freesource.info>:
> On Mon, Mar 20, 2017 at 04:38:17PM +0300, Mikhail Efremov wrote:
>
>> Я очень бегло взглянул туда, но вполне очевидно, что вы смотрите на
>> какие-то другие функции, т.к все символы, про которые ругань, объявлены
>> там как extern.
>
> Там странное -- они сначала объявлены как export, а несколькими строчками
> ниже есть макрос с присвоением им других функций, определенных в этом же
> include.

Символы, на которые идёт ругань -- это не функции, а глобальные переменные:

$ xclip -o | c++filt
verify-elf: ERROR: ./usr/lib64/libencfs.so.1.9.1: undefined symbol:
el::base::utils::s_termSupportsColor
verify-elf: ERROR: ./usr/lib64/libencfs.so.1.9.1: undefined symbol:
el::base::utils::s_currentHost[abi:cxx11]
verify-elf: ERROR: ./usr/lib64/libencfs.so.1.9.1: undefined symbol:
el::base::elStorage
verify-elf: ERROR: ./usr/lib64/libencfs.so.1.9.1: undefined symbol:
el::base::utils::s_currentUser[abi:cxx11]

Эти переменные должны быть определены в какой-то единице трансляции.
To make long story short, они запрятаны внутрь макроса
INITIALIZE_EASYLOGGINGPP, который присутствует (то есть вызывается, то
есть раскрывается) в бинарниках недалеко от main():

[15:15:36 ~/tmp/RPM/BUILD/fuse-encfs-1.9.1 <0>]$ grep -R
^INITIALIZE_EASYLOGGINGPP
encfs/test.cpp:INITIALIZE_EASYLOGGINGPP
encfs/makeKey.cpp:INITIALIZE_EASYLOGGINGPP
encfs/main.cpp:INITIALIZE_EASYLOGGINGPP
encfs/encfsctl.cpp:INITIALIZE_EASYLOGGINGPP

Получается, бинарник, который потребляет библиотеку, эти символы этой
библиотеке предоставляет.

> Как чинить сборку?

Непонятно. Библиотеки, использующие easylogging++, видимо, должны быть
недолинкованы by design.

-- 
WBR,
Ivan A. Melnikov


Подробная информация о списке рассылки Devel