Thread overview
Kendi paketimizi oluştururken derlerleme parametrelerinde nasıl yapılandırılır?
May 27

Merhaba,

Son zamanlar Phobos Kütüphanesi, karmaşıklaştıkça package.d isimli bir kolaylığa gidildiğini görüyorum. Anladığım kadarıyla dizin içindeki tüm dosyaları public import marifeti ile bir araya topluyor. Örneğin std.algorithm için konuşalım:

Altındaki tüm olanakları kullanmak istersek kısaca import ediyoruz ve sanırım bunda package.d dosyası etken olmalı. Ama dilersek de şöyle yapabiliyoruz:

import std.algorithm.comparison;
// hatta daha seçici olmak için şöyle:
import std.algorithm.comparison : equal;

Peki kendi kütüphanemiz şiştikçe bir kolaylık var mı? Şunun olduğunu biliyorum:

>

dmd -w main.d sdb/*.d -ofmain.a

Ancak benim yapmak istediğim; örneğin test isminde bir klasörüm/paketim var ve içinde de birden fazla .d uzantılı dosyaları/kodları kolayca derlemek.

Peki mypackage.d isminde şu modülü işaret etsem niye yetmez:

module mypackage;

private import test.test1;
public  import test.test2;

Derlerken:

>

dmd -w main.d test/mypackage.d -ofmain.a

Çıktısı:

>

/usr/bin/ld: main.o: in function _Dmain': test/mypackage.d:(.text._Dmain[_Dmain]+0x5): undefined reference to _D4test5test27testingFNaNbNiNfZAya'
collect2: error: ld returned 1 exit status
Error: linker exited with status 1

Elbette sebebi belli. Linker diğer dosyadaki testing() işlevine bağlantı kuramadı çünkü derlerken onları dahil etmedim ama public import test.test2 yapmakla dahil ettiğimi sanıyordum, olmadı!

Bir yardım lütfen...:)

May 27
On 5/26/22 23:32, Salih Dincer wrote:

> ```d
> module mypackage;
>
> private import test.test1;
> public  import test.test2;
> ```
> **Derlerken:**
>> dmd -w main.d test/mypackage.d -ofmain.a
>
> **Çıktısı:**
>> /usr/bin/ld: main.o: in function `_Dmain':
>> test/mypackage.d:(.text._Dmain[_Dmain]+0x5): undefined reference to
>> `_D4test5test27testingFNaNbNiNfZAya'
>> collect2: error: ld returned 1 exit status
>> Error: linker exited with status 1
>
> Elbette sebebi belli. Linker diğer dosyadaki testing() işlevine bağlantı
> kuramadı çünkü derlerken onları dahil etmedim ama `public import
> test.test2` yapmakla dahil ettiğimi sanıyordum, olmadı!

En kolay şöyle açıklanabilir: Modüller hem C'nin başlık dosyalarının hem de .c dosyalarının yerine geçiyor. import etmek, başlık dosyasını #include etmek gibi oluyor. Nasıl .c dosyasını programa eklemek gerekiyorsa, modülü de ayrıca eklemek gerekiyor.

Bu konuda bir kolaylık, D'nin -i komut satırı seçeneğidir: "import edilen dosyaları otomatik olarak programa dahil et" anlamına gelir.

Ali

May 27

On Friday, 27 May 2022 at 07:17:27 UTC, Ali Çehreli wrote:

>

Bu konuda bir kolaylık, D'nin -i komut satırı seçeneğidir: "import edilen dosyaları otomatik olarak programa dahil et" anlamına gelir.

Süper, işin ilginci ben bunu hali hazırda kullanıyordum ama şu şekilde:

>

dmd -wi main.d

Meğer o anlama gelmesi için ayırarak şöyle kullanmak gerekiyormuş:

>

dmd -w main.d -i mypackages.d -ofmain.a

Evet şimdi istediğim oldu, teşekkürler...

May 28

On Friday, 27 May 2022 at 16:41:05 UTC, Salih Dincer wrote:

>

Süper, işin ilginci ben bunu hali hazırda kullanıyordum ama şu şekilde:

>

dmd -wi main.d

Harfler benzer olunca ve birleşik parametre desteklenmediğinden bir düzeltme yapmalıyım. Gerçşi şurada açıklıyor...

Meğer -wi diye de bir derleme parametresi varmış ve biraz daha uzmanlar için çünkü uyarılara rağmen derlemeye devam ediyor:

>

-w warnings as errors (compilation will halt)
-wi warnings as messages (compilation will continue)

Bu durumda ayrı olarak -wi -i kullanmaya devam...

June 05

On Saturday, 28 May 2022 at 17:36:24 UTC, Salih Dincer wrote:

>

Bu durumda ayrı olarak -wi -i kullanmaya devam...

Her şey iptal... :)

Şimdi anlatacaklarımı yeni öğreniyorum!

Meğer derlenen D dosyasının olduğu yerde import ettiğiniz ile aynı isimide bir dizin varsa ve de içinde package.d dosyası; böylece ekstra hiçbir parametreye ihtiyaç duymadan sadece derliyor veya -run parametresi ile çalıştırıyorsunuz. O kadar!

Yani,derlemek için dmd aa yazmak şu konfigurasyon için yeterli:

aa.d dosyası (D main ./ kökde)

import ab.cdef;

int zz(S s) { return s.i; }

void main() { auto birYapı = S(1); assert(zz(birYapı)); }

package.d dosyası (./ab/cdef/ içinde)

module ab.cdef;

struct S {
  int i;
}

Dip Not: Bunları, acil makale haline getirmek lazım, çünkü her şey eskimiş. Özellikle www.ddili.org/kurulum içinde yanlış ifadeler var.

June 05
On 6/5/22 01:34, Salih Dincer wrote:

> www.ddili.org/kurulum içinde yanlış ifadeler var.

Eminim. :( Bir çok sayfayı yenilemek gerek.

Ali

June 16

On Monday, 13 June 2022 at 06:05:03 UTC, Tejas wrote:

>

Directory structure:


src
|
|--- main_file.d
|
|---parent
      |
      |--- driver.d
      |
      |--- package.d
      |
      |--- thing
             |
             |--- package.d
             |
             |--- first.d
             |
             |--- second.d
             |
             |--- third.d

Code :
src/main_file.d:

import parent;

void main()
{
	func();
}

src/parent/package.d:

module parent;

public import
	driver;

src/parent/driver.d:

module parent.driver;

import thing;

void func()
{
	S s;			// from third.d
	auto t = first.a;	// from second.d
	auto l = second.dbl;	// from first.d
}

src/parent/thing/package.d:

module parent.thing;

public import
	first,
	second,
	third;

src/parent/thing/first.d:

module thing.first;

import second;

static this()
{
	a = second.g; // can also access symbols within neighbouring modules
}
package(parent):
int a;
int b;
string c;

src/parent/thing/second.d:

module thing.second;

package(parent):

int g;
char p;
double dbl;

src/parent/thing/third.d:

module thing.third;

package(parent):

struct S
{
	int a;
	char c;
	string s;
}

private S private_struct; // can't access via parent package, since marked private

You run it via:
dmd -i -I=./parent -I=./parent/thing main_file.d
(I'm pretty sure it'll look far prettier using dub)

Here, all the symbols that are within package thing are visible to package parent as well, but not visible to any other package/module

Çok şık bir çalışma, konu dahilinde olduğu için paylaşıyorum. Gerçi soruyu soran da (3 gün olmuş!) başkası da unutmuşa benziyor ama unutulmaması gerekir. Bizzat denedim, derleniyor...

Konunun adresi:

https://forum.dlang.org/post/kmgwcapkusvoxqapxrib@forum.dlang.org#post-cbhakdbwkpnsojwsiqdo:40forum.dlang.org

Başarılar...