Компиляция проекта D в виде библиотеки - что происходит с зависимостями? - PullRequest
1 голос
/ 01 октября 2019

Хорошо, вот мой вопрос:

У меня есть работающий проект DUB, который создает приложение. Я решил, что мне также нужна конфигурация "библиотеки" в моем файле dub.json:

"configurations": [
    {
        "name": "application",
        "targetType": "executable"
    },
    {
        "name": "library",
        "targetType": "library",
    }
],

Итак, теперь, когда я собираю проект с использованием dub build --config=library, он создает файл libXXXX.a в том же каталоге.

Пока все хорошо.

Я пытался использовать эту библиотеку (на самом деле крошечная тестовая функция, помеченная как extern "C" из тестового приложения C).

Итак, Я компилирую свое приложение C, используя gcc -c ctest.c, а затем связываю их все вместе, как dmd libMYLIBRARY.a ctest.o.

Теперь вот проблема:

На этом последнем шаге, компоновщик жалуется на отсутствие многих символов - все они исходят из внешних зависимостей (2 объектных файла и несколько .a библиотек), которые обычно связываются при сборке проекта как приложения.

Итак, вопрос в том ... как мне решить эту проблему?

Я имею в виду ... Должен ли я просто связать свое тестовое приложение C со ВСЕМИ исходными зависимостями (это непо общему признанию, сделать библиотеку очень портативной)у библиотеки, только связавшись с моим libXXXXX.a файлом?

1 Ответ

3 голосов
/ 01 октября 2019

Должен ли я просто связать свое тестовое приложение C со ВСЕМИ исходными зависимостями (это, по общему признанию, не сделало бы библиотеку очень переносимой),

Это "технически правильный" ответ. Причина в том, что, в противном случае, если приложение C хотело использовать другую библиотеку D, которая имела среди своих зависимостей какой-либо пакет, который также является зависимостью в вашей библиотеке, и если она была связана таким же образом (включая все свои зависимости вего статическая библиотека), эта зависимость затем будет дважды встречаться на входах компоновщика. Даже если вы сказали компоновщику отказаться от одной копии, могут возникнуть проблемы из-за зависимости отдельных несовместимых версий и т. Д. (Обратите внимание, что для этого существует постоянный проект D SAOC .)

Если вы предполагаете, что единственная библиотека D, которую будет использовать программа C, это ваш пакет Dub, то вы могли бы создать статическую библиотеку, которая включает все зависимости, хотя, вероятно, потребуется включить стандартную библиотеку D и среду выполнения. а также.

...