Я создаю разделяемую библиотеку gcc со статической зависимостью библиотеки.
Я компилирую части для статической библиотеки следующим образом:
gcc -c -m64 -O2 -fPIC -std=c99 -Wall ms*.c //there are 10 C files, no warnings
Затем я создаю статическую библиотеку с:
ar rc static_lib.a ms*.o
Затем я собираю части для моей программы следующим образом:
g++ -c -m64 -O2 -fPIC -std=c++14 -Wall ab*.cpp //there are 5 C++ files, just -Wunused-variable warnings
Затем я создаю общую библиотеку следующим образом:
g++ -shared -g -Wall ab*.o static_lib.a -o shared_lib.so
в обычном случае этот shared_lib.so будет вызываться программой Ruby с использованием интерфейса сторонней функции. Нет проблем, если я сделаю это на Ubuntu или Mac (.dylib), но если я попробую это на Debian Stretch, я получу ошибку связанные со статической библиотекой как будто конфигурации не установлены должным образом. Если я запускаю приложение без стороннего интерфейса функций, такого как создание тестера и запуск с основной функцией файла cpp, как показано ниже:
> g++ -o library_test ab*.o static_lib.a
> ./library_test
Нет проблем!
У меня вопрос, какая конфигурация для создания разделяемой библиотеки может отсутствовать здесь, чтобы не получить такого нежелательного поведения. Особенно на Debian Stretch 9,5!
Или есть способ, который я могу понять, если есть проблема в общей библиотеке.
Из комментариев вы указываете, что проблема с #define
, Те препроцессор директивы. Библиотеки для линкер.
Вы можете быть смущены, потому что g++
включает в себя фазу препроцессора и может вызывать компоновщик в зависимости от запрошенного вывода. Еще, g++
следует правилам языка C ++.
Других решений пока нет …