Линкер оптимизирует разделяемую библиотеку - PullRequest
0 голосов
/ 13 марта 2020

Используя компиляторы CMake и gcc / clang, я хочу создать из этого файла общую библиотеку (Registrator.cpp):

#include ...

namespace
{

struct Registrator
{
    Registrator()
    {
        ...
    }
    ~Registrator()
    {
        ...
    }
} g_registrator [[gnu::used, gnu::visibility("default")]];

} // namespace

Этот объект больше нигде не используется. Его ответственность заключается исключительно в том, чтобы делать некоторые вещи во время его (де) конструирования.

При определении его как:

add_library(${libname} OBJECT Registrator.cpp)

Это способ предотвратить оптимизацию компоновщика этого TU, как в OBJECT на случай, если все исходные коды попадут в конечный исполняемый файл.

Однако я хочу использовать его и в качестве SHARED библиотеки. А в случае:

add_library(${libname} SHARED Registrator.cpp) 

библиотека вообще не связана, и, к сожалению, gnu::visibility("default") не совсем обрезает ее.

Есть ли способ достичь этого? Заранее спасибо за помощь.

Приветствия:)

1 Ответ

1 голос
/ 13 марта 2020

Предполагая использование g ++, вы можете отключить поведение ссылки --as-needed. Это включено по умолчанию, что может привести к проблеме, которую вы видите. Попробуйте передать флаг ссылки, чтобы отключить его, используя команду CMake target_link_options():

add_library(${libname} SHARED Registrator.cpp)
target_link_options(${libname} PUBLIC "-Wl,--no-as-needed")
...