CMake: связать спецификацию c .o внутри библиотеки с моей целью - PullRequest
0 голосов
/ 06 марта 2020

Мой google-fu провалился, поэтому я спрашиваю здесь.

По какой-то причине я хочу связать конкретный c объект внутри библиотеки с моей целью.

Например, я хочу связать foo.o в bar.a с foobar.so.

Есть ли какой-то синтаксис в CMake, который делает это возможным?

edit: Ok , немного больше моей проблемы.

Мы создаем модульную систему обработки сигналов с различными «уровнями» реализации:

  • Python эталонная модель
  • C / C ++ с плавающей точкой
  • C / C ++ с фиксированной точкой
  • C / C ++ DSP оптимизированная версия

Для каждого C / C ++ создается отдельный файл .a реализация. Все они поддерживают интерфейс с фиксированной запятой и интерфейс с плавающей запятой, хотя они реализуют только один из интерфейсов и выполняют перевод / батут на другой.

Другими словами, реализация с плавающей запятой имеет реализацию алгоритма с плавающей запятой и точку входа с фиксированной запятой, которая переводит все входные данные в float перед вызовом API на основе float.

Оптимизированная для DSP реализация реализует точки входа с фиксированной точкой и предоставляет «батут» с плавающей точкой для преобразования из плавающей точки в фиксированную перед вызовом фактической реализации.

Все это позволяет нам смешивать / сопоставлять реализации, чтобы мы могли начать с идеальной модели с плавающей запятой, и постепенно разработать оптимизированную версию DSP. Все это прекрасно работает в проекте C / C ++, где вы просто связываете желаемую реализацию модуля, и он «просто работает».

Кикер - наша начальная модель python, и мы хотим иметь возможность вызов кода C / C ++ из python с привязками pybind11.

Время соединения общих объектов pybind11 очень медленное и создает действительно большие объекты (даже с рекомендуемыми настройками я получаю 3 МБ DLL) ) и у нас будет много модулей, поэтому я ищу способ сократить количество .so, которое мы делаем, комбинируя фиксированную и плавающую запись в одном и том же .so. говоря что-то вроде:

module_pybind.so = module_fixed.a (fixed.o) + module_float.a (float.o)

и module_fixed.a (float.o) и module_float. a (fixed.o) не включается, потому что это просто батутные функции.

Я знаю, это все немного странно и запутанно, и я мучаю вещи, которые выходят за рамки нормы, но я надеюсь, что это может сработать.

Если нет, я могу поиграть в другие трюки с батутами и иметь точку входа pybind, указывающую c, которая есть только для реализованной модели.

1 Ответ

2 голосов
/ 06 марта 2020
Файл

.a представляет собой архив .o файлов. Вы можете распаковать архив с помощью команды ar x library.a с соответствующими зависимостями с add_custom_command + add_custom_target. Тогда просто add_library(... SHARED the_unpacked_object.o).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...