Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么fltk config的输出会截断gcc的参数?_C++_Python_C_Scons_Fltk - Fatal编程技术网

C++ 为什么fltk config的输出会截断gcc的参数?

C++ 为什么fltk config的输出会截断gcc的参数?,c++,python,c,scons,fltk,C++,Python,C,Scons,Fltk,我正在尝试构建一个我下载的应用程序,它使用SCON“make replacement”和Fast Light工具包Gui 检测fltk存在的SCO构造代码为: guienv = Environment(CPPFLAGS = '') guiconf = Configure(guienv) if not guiconf.CheckLibWithHeader('lo', 'lo/lo.h','c'): print 'Did not find liblo for OSC, exiting!'

我正在尝试构建一个我下载的应用程序,它使用SCON“make replacement”和Fast Light工具包Gui

检测fltk存在的SCO构造代码为:

guienv = Environment(CPPFLAGS = '')
guiconf = Configure(guienv)

if not guiconf.CheckLibWithHeader('lo', 'lo/lo.h','c'):
    print 'Did not find liblo for OSC, exiting!'
    Exit(1)

if not guiconf.CheckLibWithHeader('fltk', 'FL/Fl.H','c++'):
    print 'Did not find FLTK for the gui, exiting!'
    Exit(1)
不幸的是,在我的(Gentoo Linux)系统和许多其他系统(Linux发行版)上,如果包管理器允许同时安装FLTK-1和FLTK-2,这可能会非常麻烦

我试图修改SConstruct文件以使用
fltk-config--cflags
fltk-config--ldflags
(或者
fltk-config--libs
可能比
ldflags
)如下添加:

guienv.Append(CPPPATH = os.popen('fltk-config --cflags').read())
guienv.Append(LIBPATH = os.popen('fltk-config --ldflags').read())
但这会导致liblo测试失败!查看
config.log
显示了它是如何失败的:

scons: Configure: Checking for C library lo...
gcc -o .sconf_temp/conftest_4.o -c "-I/usr/include/fltk-1.1 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT"
gcc: no input files
scons: Configure: no
这真的应该怎么做

为了完成我的回答,我如何从
os.popen('command').read()的结果中删除引号

EDIT这里真正的问题是,为什么追加
fltk config
的输出会导致gcc没有收到它应该编译的文件名参数?

这是一个非常复杂的问题,没有快速的答案 我已经参考了在scons上使用
pkg config
的说明。下面的问题也很有帮助

但我们需要在这些方面做得更进一步

因此,经过大量调查,我发现
os.popen('command').read()
没有修剪尾随的换行符'\n',这是导致发送到GCC的参数被截断的原因

我们可以使用str.rstrip()删除尾部的“\n”

其次,正如
config.log
所示,
fltk-config
提供的参数,scon在将它们提供给GCC之前用双引号括起来。我不太清楚具体细节,但这是因为
fltk config
(通过
os.popen
)的输出包含空格字符

我们可以使用类似于
strarray=str.split(“,str.count(”)
的方法将输出拆分为空格字符所在的子字符串

还值得注意的是,我们试图将
fltk config--ldflags
附加到GUI环境中的错误变量,它们应该被添加到
LINKFLAGS

不幸的是,这只是解决方案的一半。 我们需要做的是:

  • 查找系统上可执行文件的完整路径
  • 将参数传递给可执行文件并捕获其输出
  • 将输出转换为适当的格式,以附加到
    CPPFLAGS
    LINKFLAGS
所以我定义了一些函数来帮助

1) 在系统上查找可执行文件的完整路径: (见:)

1b)我们还需要测试是否存在可执行文件:

def CheckForExecutable(context, program):
    context.Message( 'Checking for program %s...' %program )
    if ExecutablePath(program):
        context.Result('yes')
    return program
    context.Result('no')
2) 将参数传递给可执行文件并将输出放入数组:

def ExecutableOutputAsArray(program, args):
    pth = ExecutablePath(program)
    pargs = shlex.split('%s %s' %(pth, args))
    progout = subprocess.Popen( pargs , stdout=subprocess.PIPE).communicate()[0]
    flags = progout.rstrip()
    return flags.split(' ', flags.count(" "))
一些用法:

guienv.Append(CPPFLAGS =  ExecutableOutputAsArray('fltk-config', '--cflags') )
guienv.Append(LINKFLAGS = ExecutableOutputAsArray('fltk-config', '--ldflags') )
guienv.Append(LINKFLAGS = ExecutableOutputAsArray('pkg-config', '--libs liblo') )

有两种类似的方法可以做到这一点: (一)

(二)


哦,孩子。它起作用了。如果您将这些添加到测试条件中,如果上述两行成功,我将接受这一正确答案。干杯。我已经试过了,它似乎起作用了:
如果没有guienv.ParseConfig(“fltk-config--cflags”):print'failed to run fltk-config你确定安装了fltk!?'退出(1)
但我只想确保这是正确的,因为我现在没有一个系统没有安装FLTK进行测试。Imran,感谢这些,我尝试了两种方法,但只成功地使第一个版本工作。
guienv.Append(CPPFLAGS =  ExecutableOutputAsArray('fltk-config', '--cflags') )
guienv.Append(LINKFLAGS = ExecutableOutputAsArray('fltk-config', '--ldflags') )
guienv.Append(LINKFLAGS = ExecutableOutputAsArray('pkg-config', '--libs liblo') )
conf = Configure(env)
status, _ = conf.TryAction("fltk-config --cflags")
if status:
  env.ParseConfig("fltk-config --cflags")
else:
  print "Failed fltk"
  try:
    env.ParseConfig("fltk-config --cflags")
  except (OSError):
    print 'failed to run fltk-config you sure fltk is installed !?'
    sys.exit(1)