【问题标题】:How can we compile multiple c files using meson-build and ninja?我们如何使用 meson-build 和 ninja 编译多个 c 文件?
【发布时间】:2021-12-08 06:07:27
【问题描述】:

我创建了一个 C 项目,在不同的目录中有多个文件,这些文件是使用 Makefile 编译的。该项目在 LIB_x86_64 中有库,在 include 中有头文件。我需要使用 meson-build 或 ninja 编译所有这些。 我写了一个 build.ninja 文件,其中包含

rule cc

  command = gcc -c -o $out $in

  description = CC $out

rule link

  command = gcc -o $out $in

  description = LINK $out

build led.o: cc client/src/led.c

build demoCAN.o: cc client/src/demoCAN_AP.c

build commander_test.o: cc client/test/commander_test.c

build led: link led.o

build demoCAN: link demoCAN.o

build commander_test: link commander_test.o 

但是我收到关于找不到头文件的错误。建议将不胜感激。

【问题讨论】:

  • 仔细检查构建环境中的路径变量是否已设置?这个conversation on sub-processes to set paths 是旧的,但可能是相关的。 (我希望现在ninja 提供设置路径的能力)
  • 这里真的需要担心环境变量吗?实际上我在包含目录中有一个头文件,我希望 ninja 引用该目录。
  • 如果你没看过这里,在The Ninja build system中搜索C/C++ header dependencies
  • 你是想用介子来生成你的忍者,还是直接写忍者? Ninja 真的不是直接写的,它真的是由 meson 或 cmake 之类的东西生成的
  • @dcbaker 是的,我目前正在编写忍者脚本,但我想使用介子执行此操作,但无法使用多个 c 文件执行此操作。

标签: c makefile ninja meson-build


【解决方案1】:

所以,要移植你所拥有的,你会写这样的东西:

project('demo', 'c')

executable('led', 'led.c')
executable('demoCAN', 'demoCAN.c')
exectuable('commander_test', 'commander_test.c')

这声明了一个名为 demo 的项目,使用 c 语言,具有三个可执行目标,每个目标都有一个源。

构建可执行文件、库、shared_library 等目标。将源文件作为可变位置参数,因此您可以执行以下操作:

lib = static_library('commander', 'commander.c', 'utils.c', 'runner.c')
executable('commander_test', 'commander_test.c', link_with : lib)

介子会为每个 .c 文件生成编译目标,然后链接 libcommander.a,然后将其与 commander_test 可执行文件链接。

【讨论】:

  • -@dcbaker 感谢您提供如此全面的答案,我在 client/LIB_x86_64 目录中有 .so (共享库)文件,我如何链接它们以便编译,我收到错误因为这些文件没有链接。我试过像上面那样做,但它说没有指定的编译器可以处理 .so 文件
  • 预编译的.so,还是你自己编译的?如果您像lib = static_lib 示例一样自己编译它,但使用shared_lib。如果它是预编译的,你想要 dep = find_library('lib', dirs : '.') 之类的东西(假设它被称为 liblib.so),那么你将 dep 传递给你想要链接到的 dependencies 关键字参数。
  • -Wl,--as-needed -Wl,--no-undefined -Wl,--start-group /root/ninja-sensor-hub/20-10-2021/mview-sensor-hub-8.8.0/client/LIB_x86_64/libMUT.so /root/ninja-sensor-hub/20-10-2021/mview-sensor-hub-8.8.0/client/LIB_x86_64/librabbitmq.so /root/ninja-sensor-hub/20-10-2021/mview-sensor-hub-8.8.0/client/LIB_x86_64/libPMUT.so /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libpthread.so /lib64/libcurl.so /lib64/libjson-c.so -Wl,--end-group '-Wl,-rpath,$ORIGIN/../client/LIB_x86_64:/lib64' -Wl,-rpath-link,/root/ninja-sensor-hub/20-10-2021 得到这个,你能帮忙解决一下吗?
  • 什么链接器行可能很好,你遇到了什么错误?
  • 忍者:构建停止:子命令失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多