Ara*_*atK 5 ruby binding swig ff
假设我要用命令编译一个 C 文件
g++ a.cpp -I/usr/local/gr/include -L/usr/local/gr/lib -lGR -lm -Wl,-rpath,/usr/local/gr/lib
Run Code Online (Sandbox Code Playgroud)
我将如何在 SWIG 中定义 extconf.rb 文件,以便它不会忽略链接器路径?
这是我当前的 extconf.rb 文件。
require 'mkmf'
system('swig -c++ -ruby example.i') or abort
$CXXFLAGS += " -I/usr/local/gr/include -L/usr/local/gr/lib -lGR -lm -Wl,-rpath,/usr/local/gr/lib "
create_makefile('example')
Run Code Online (Sandbox Code Playgroud)
它忽略带有错误的链接器标志
clang: warning: -lGR: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -lm: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: -Wl,-rpath,/usr/local/gr/lib: 'linker' input unused [-Wunused-command-line-argument]
clang: warning: argument unused during compilation: '-L/usr/local/gr/lib' [-Wunused-command-line-argument]
Run Code Online (Sandbox Code Playgroud)
对 ruby 或构建系统几乎一无所知,您似乎想将其更改为:
require 'mkmf'
system('swig -c++ -ruby example.i') or abort
$CXXFLAGS += " -I/usr/local/gr/include "
$LDFLAGS += " -L/usr/local/gr/lib -lGR -lm -rpath,/usr/local/gr/lib "
create_makefile('example')
Run Code Online (Sandbox Code Playgroud)
因为通常构建系统将编译和链接分为两个单独的阶段,编译标志来自名为CCFLAGS/的变量CXXFLAGS(分别针对 C 和 C++ 编译器),链接器标志按照惯例来自LDFLAGS。
您从 clang 看到的错误消息表明它被作为编译器调用,并告诉您在仅编译(而不是链接)时,它会忽略您为其提供的仅适用于链接的额外选项。
您可能需要也可能不需要-Wl像我在这里所做的那样删除参数的一部分 - 决定取决于您是直接调用链接器(通常为 /usr/bin/ld ),还是使用 clang/gcc 作为一个链接器。