c ++ - Hvordan kan jeg lave en 'wscript'-fil, der kompilerer en c-fil med et sæt cxxflags og en cpp med et andet sæt cxxflags

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at kompilere et NodeJS-indbygget modul med to filer: 1 .c-fil og 1 .cpp-fil. Her er hvad min 'wscript' fil ser ud:


def set\_options(opt):
  opt.tool\_options("compiler\_cxx")

def configure(conf):
  conf.check\_tool("compiler\_cxx")
  conf.check\_tool("node\_addon")

def build(bld):
  obj = bld.new\_task\_gen("cxx")
  obj.cxxflags = ["-g", "-D\_FILE\_OFFSET\_BITS=64", "-D\_LARGEFILE\_SOURCE", "-Wall", "-x", "objective-c"]
  obj.source = "c-file.c"
  obj = bld.new\_task\_gen("cxx", "shlib", "node\_addon")
  obj.cxxflags = ["-g", "-D\_FILE\_OFFSET\_BITS=64", "-D\_LARGEFILE\_SOURCE", "-Wall"]
  obj.target = "binding"
  obj.source = "cpp-file.cc"


Dette bygger mig en binding.node fil, som jeg så delvist kan bruge i Node, men så snart jeg kalder funktionen, der er placeret i C-filen (den ene kompileret først i wscriptet ovenfor), krasjer Node med noget lignende :


dyld: lazy symbol binding failed: Symbol not found: \_\_Z9getSomethingv
  Referenced from: /Users/nrajlich/test/build/default/binding.node
  Expected in: flat namespace


Dette får mig til at tro, at den første fil ikke er inkluderet i koblingsfasen, men jeg er bare ikke sikker på, hvordan jeg skulle tilføje det. Eventuelle ideer? Tak på forhånd!

Bedste reference


Jeg tror ikke, hvad jeg oprindeligt prøvede at gøre, er muligt med waf.


I dette tilfælde forsøgte jeg at kompilere C ++ og Obj-C kode sammen og bruge dem sammen. Oprindeligt havde jeg Obj-C-koden i .c -filerne og C ++-koden i .cc -filerne og forsøgte at videregive forskellige flag for de forskellige filtyper.


Siden da har jeg lært, at Obj-C og C ++ kan kombineres i samme fil! Og jeg havde lige brug for at tilføje et -ObjC++ flag til g++. Det blev nemt gjort i waf]], og også lov til at konsolidere alle de nødvendige ting i en enkelt fil. Alt fungerer fint derfra.


Så jeg kunne løse det, jeg oprindeligt forsøgte at gøre, men det oprindelige spørgsmål, jeg spurgte, tror jeg ikke er muligt at gøre med waf. Skål!

Andre referencer 1


def set\_options(opt):
  opt.tool\_options("compiler\_cxx")

def configure(conf):
  conf.check\_tool("compiler\_cxx")
  conf.check\_tool("node\_addon")

def build(bld):
  obj = bld.new\_task\_gen("cxx", "shlib", "node\_addon")
  obj.cxxflags = ["-g", "-D\_FILE\_OFFSET\_BITS=64", "-D\_LARGEFILE\_SOURCE", "-Wall"]
  obj.target = "binding"
  obj.source = """
    cpp-file.cc
    c-file.c
  """


Sådan skal du gøre det.