Difference between revisions of "Using C libraries for a D program"

From D Wiki
Jump to: navigation, search
(need a real target name for PROG)
(use correct binding extension)
Line 9: Line 9:
 
::'''/usr/local/lib/libbu.so'''
 
::'''/usr/local/lib/libbu.so'''
  
* a D language binding source file to the C library API headers:
+
* a D language binding interface file to the C library API headers:
::'''/usr/local/include/bu.d'''
+
::'''/usr/local/include/bu.di'''
  
 
We first create a GNU Makefile to build program '''test-bu''' using those three files (note the leading spaces on lines following targets must be tabs in a real GNU Makefile):
 
We first create a GNU Makefile to build program '''test-bu''' using those three files (note the leading spaces on lines following targets must be tabs in a real GNU Makefile):
Line 21: Line 21:
 
MODDIR = /usr/local/brlcad/include
 
MODDIR = /usr/local/brlcad/include
  
BINDING = $(MODDIR)/bu.d
+
BINDING = $(MODDIR)/bu.di
  
 
PROG = test-bu
 
PROG = test-bu
Line 45: Line 45:
 
The GNU Makefile can be made more general and efficient, but it should produce the desired binary program.   
 
The GNU Makefile can be made more general and efficient, but it should produce the desired binary program.   
  
Note also that a fully D-supporting C library installation would probably have the D binding source available as a pre-compiled *.o file.
+
Note also that a fully D-supporting C library installation would probably have the D binding interface available as a pre-compiled *.o file.

Revision as of 21:00, 15 May 2014

WARNING: This crude recipe by an absolute D newbie has not yet been tested--corrections are welcome!

Assume one has the following, error-free files:

  • a D language source program:
./main.d
  • a C ABI shared library file:
/usr/local/lib/libbu.so
  • a D language binding interface file to the C library API headers:
/usr/local/include/bu.di

We first create a GNU Makefile to build program test-bu using those three files (note the leading spaces on lines following targets must be tabs in a real GNU Makefile):

$ cat Makefile
# use the dmd compiler
DMD = /usr/bin/dmd

LIBDIR = /usr/local/brlcad/lib
MODDIR = /usr/local/brlcad/include

BINDING = $(MODDIR)/bu.di

PROG = test-bu

all: $(PROG)

$(PROG): main.o bu.o
        $(DMD) -o $@ main.o bu.o -L$(LIBDIR) -lbu
 
%.o: %.d
        $(DMD) -c $< -o $@

bu.o: $(BINDING)
        $(DMD) -c $< -o $@

clean:
        -rm $(PROG) *.o

Then we can build test-bu by executing:

$ make test-bu

The GNU Makefile can be made more general and efficient, but it should produce the desired binary program.

Note also that a fully D-supporting C library installation would probably have the D binding interface available as a pre-compiled *.o file.