【问题标题】:Run c scrips from a shell script从 shell 脚本运行 c 脚本
【发布时间】:2014-01-31 16:03:54
【问题描述】:

我有这个 shell 脚本

#!/bin/csh
@ x = 1
while ($x <= 2)
nohup ./prog1 && ./prog2 &
@ x ++
end

我想顺序运行 2 次 prog1 和 prog2,它们之前是通过 makefile 编译的。我该怎么做?剧本对吗?

如果我这样做

chmod u+x test.csh
./test.csh

我收到此错误

./prog1: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./prog1)

这是我的makefile

GSLFLAGS := `pkg-config --cflags gsl`  
LIBGSL := `pkg-config --libs gsl`
CFLAGS = -O3 -fopenmp
LIBOMP = -lgomp

dist.o:dist.cxx
    g++ -Wall -c dist.cxx

prog1.o:prog1.cxx
    g++ -Wall -c prog1.cxx  $< ${GSLFLAGS} ${CFLAGS}

prog1:prog1.o dist.o 
    g++ ${CFLAGS} -o  $@ $^ ${LIBGSL} 

prog2.o:prog2.cxx
    g++ -Wall -c prog2.cxx  $< ${GSLFLAGS} ${CFLAGS}

prog2:prog2.o dist.o 
    g++ ${CFLAGS} -o  $@ $^ ${LIBGSL} 

【问题讨论】:

  • 从 shell 运行 ./prog1 会得到什么?
  • 它工作正常,这就是奇怪的部分
  • 你的普通shell是/bin/csh吗?另外,从命令行运行nohup ./prog1 也可以吗?
  • 是的 nohup ./prog1 也可以
  • 我建议你在普通 shell 中运行“set | grep -i LIB”,然后输入与上面脚本第二行相同的命令。然后查看差异并查看在脚本中运行时缺少什么,然后更正脚本的库搜索路径。

标签: c++ c shell csh


【解决方案1】:

似乎标准 C++ 库的搜索路径在 csh 中与从命令行运行时设置的不同。

Linking the standard libraries statically 应该使库搜索路径无关:更改您的 makefile 如下:

CFLAGS = -O3 -fopenmp -static-libgcc -static-libstdc++

【讨论】:

  • 但是 while 是如何工作的?在我看来,它并行运行 prog1 和 prog2 两次,而不是 prog1 prog2 prog1 prog2
  • @user3036416 这不就是你想要的效果吗?您的脚本告诉nohup 将程序放在后台,因为您在末尾放置了一个& 符号&amp;。如果您希望按顺序运行它们,请删除 & 符号。更好的是,“展开”循环(即,按照另一个答案的建议,逐个“说明”它的动作),因为您的循环非常短。
  • 我删除了最后的 & 现在好了!谢谢
  • 请注意,OP,这是一种贴膏药。问题实际上是您的两个 shell 中的库搜索路径不同。如果您按照此处的建议进行静态链接,则您的二进制文件会更大,因为它将包含通常在二进制文件之间共享的所有库代码 - 因此加载和消耗系统资源需要更长的时间。静态链接还有其他缺点,所以请考虑您是否真的想这样做。
【解决方案2】:

如果你真的想按你的要求做,使用这个:

#!/bin/csh
./prog1
./prog2
./prog1
./prog2

我感觉你对后台进程等感到困惑。

如果 prog1 成功退出,则运行 prog1 然后运行 ​​prog2:

./prog1 && ./prog2

先运行 prog1,然后运行 ​​prog2:

./prog1; ./prog2

在后台运行 prog1:

./prog1 &

睡 8 秒然后按铃,但请立即回复我的提示:

(sleep 3; sleep 5;echo $'\a') &

【讨论】:

  • 如果我有很多迭代怎么办?
  • 你说你有两个。
最近更新 更多