Как создать ссылку на пакет в статической библиотеке с помощью Visual D

Я использую VisualD и DMD, чтобы написать D в Visual Studio 2012.

Мое решение выглядит так в обозревателе решений:

ConsoleApp1 (solution name)
- codecramlib (a static D library)
- - http (folder)
- - - package.d 
- - - request.d
- malakai (console project)
- - main.d

codecramlib

Моя статическая D библиотека codecramlib строит хорошо сам по себе. Вот источник:

в упаковке

module codecramlib.http;

public import request;

request.d

module request;

// temporary filler code
class Request
{
    public int imARequest()
    {
        return 13;
    }
}

Когда я нажимаю правой кнопкой мыши на codecramlib и построить я получаю этот вывод в консоли VS:

------ Build started: Project: codecramlib, Configuration: Debug Win32 ------
Building Debug\codecramlib.lib...
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Малакай (основной проект)

main.d:

import std.stdio;
import codecramlib.http; // also tried import codecramlib;

int main(string[] argv)
{
    writeln("Hello D-World!");
    return 0;
}

я добавил codecramlib как зависимость малакай, щелкнув правой кнопкой мыши на malakai выберите "Свойства"> "Свойства конфигурации"> "Компилятор"> "Общие" и измените поле "Дополнительные операции импорта" на "../codecramlib". Затем я нажимаю "Применить" и "ОК".

когда я щелкну правой кнопкой мыши на malakai в обозревателе решений и нажмите кнопку Построить, я получаю эту ошибку:

Error   1   Error: module http is in file 'codecramlib\http.d' which cannot be read C:\Users\< path removed >\Visual Studio 2012\Projects\ConsoleApp1\malakai\main.d    2   

Поиск проблемы

Первым делом я попытался изменить строку "Дополнительный импорт" на:

../

Похоже, это помогло, поскольку ошибка сборки была изменена на: Ошибка 1 Ошибка: запрос модуля находится в файле "request.d", который невозможно прочитать C:\Users\<путь удален>\Visual Studio 2012\Projects\ConsoleApp1\codecramlib\http\package.d 3

В попытке заставить компилятор распознать request.d в codecramlib Статическая библиотека, я изменил package.d, чтобы читать:

module codecramlib.http;

public import http.request;

Похоже, это был шаг назад, потому что тогда библиотека codecramlib больше не создавалась, и когда я пытался собрать malakai, я получал следующие ошибки:

Error   1   Error: module request from file http\request.d must be imported as module 'request' C:\Users\< path removed >\Visual Studio 2012\Projects\ConsoleApp1\codecramlib\http\package.d    3   
Error   2   Error: module request is in file 'http\request.d' which cannot be read  C:\Users\< path removed >\Visual Studio 2012\Projects\ConsoleApp1\codecramlib\http\package.d    3   

Как использовать пакет codecramlib.http в статической библиотеке codecramlib в моем проекте консоли malakai с Visual D?

редактировать

Исправлена ​​структура моей папки, как показано в обозревателе решений. Мои отступы package.d и request.d были неверны.

Редактировать 2

Добавлен контент main.d

2 ответа

Решение

Эта часть

Первым делом я попытался изменить строку "Дополнительный импорт" на:

../

Похоже, это помогло, поскольку ошибка сборки была изменена на: Ошибка 1 Ошибка: запрос модуля находится в файле "request.d", который невозможно прочитать C:\Users\ <путь удален> \Visual Studio 2012\Projects\ConsoleApp1\codecramlib\http\package.d 3

заставляет меня поверить, что причина в том, что ваш модуль запроса не находится в пакете codecramlib.http, и из-за этого dmd не знает, как искать / codecramlib / http / для request.d.

Я предлагаю оставить поле "Дополнительный импорт" как "../" и переименовать модуль в codecramlib / http / request.d, чтобы codecramlib.http.request и затем измените свой импорт в codecramlib / http / package.d на public import codecramlib.http.request,

Вообще говоря, вы хотите сопоставить имена ваших модулей с макетом каталога.

Простой ответ заключается в том, что вы не можете импортировать весь пакет (папки в D, называемые пакетами), поэтому в ваш main.d следует импортировать codecramlib.http.request.

Кроме того, пакет не является библиотекой, вы не можете связываться с ним, а только импортировать модули, которые просто добавляют объявления из модуля в локальную область видимости.

В попытке заставить компилятор распознавать request.d в статической библиотеке codecramlib, я изменил package.d так, чтобы он читал:

модуль codecramlib.http;

публичный импорт http.request;

тем самым вы добавили модуль http в пакет codecramlib.http, и вы правы в том, что с помощью открытого импорта можно импортировать все, что связано с модулем, с одним оператором импорта в коде, поэтому в main.d теперь можно импортировать codecramlib.http..htpp, где первый http - это пакет, а второй - модуль, но я не рекомендую давать модулям то же имя, что и пакет, чтобы избежать конфликта имен.

Другие вопросы по тегам