Как я могу сделать файл 'wscript', который компилирует файл c с одним набором флагов cxx и cpp с другим набором флагов cxxflags - PullRequest
3 голосов
/ 11 апреля 2011

Я пытаюсь скомпилировать собственный модуль NodeJS, используя два файла: 1 .c файл и 1 .cpp файл. Вот как выглядит мой файл wscript:

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"

Это создает мне файл binding.node, который я могу затем частично использовать в Node, но как только я вызываю функцию, расположенную в файле C (ту, которая была скомпилирована первой в wscript выше), Node падает с чем-то как:

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

Это наводит меня на мысль, что первый файл не включается в фазу связывания, но я просто не уверен, как мне его добавить. Есть идеи? Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 23 августа 2011
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
  """

Вот как вы должны это сделать.

1 голос
/ 05 мая 2011

Я не думаю, что то, что я изначально пытался сделать, возможно с waf.

В этом случае я пытался скомпилировать код C ++ и Obj-C вместе и использовать их вместе. Первоначально у меня был код Obj-C в файлах .c и код C ++ в файлах .cc, и я пытался передать разные флаги для разных типов файлов.

С тех пор я узнал, что Obj-C и C ++ могут быть объединены в одном файле! И мне просто нужно было добавить флаг -ObjC++ к g++. Это было легко сделано в waf, а также позволило объединить все необходимые вещи в один файл. Оттуда все отлично работает.

Таким образом, я смог решить то, что первоначально пытался сделать, однако исходный вопрос, который я задал, я не думаю, что можно сделать с waf. Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...