我尝试通过覆盆子pi上的swig / c / php界面启动'mjpg-streamer'。以前,通过swig / c / php成功控制了两个应用程序:
如果是'mjpg-streamer',我使用了以下代码:
的
的 void stream(void) {
system("export LD_LIBRARY_PATH=/usr/local/lib/");
system("mjpg_streamer -o 'output_http.so -w /media/MINIUSB/dev/Control/www' -i 'input_raspicam.so -x 640 -y 480 -fps 15'");
}
的
并像GPIO控件一样运行'make'
swig -Wextra -php camera.i
gcc -fpic -c `php-config --includes` camera.c camera_wrap.c
gcc -shared camera_wrap.o camera.o -o camera.so
cp camera.so `php-config --extension-dir`
service lighttpd restart
最后我运行'chmod 4755 /usr/local/lib/input_raspicam.so'和'chmod 4755 /usr/local/lib/output_http.so',因为我这样做是为了启用'i2cset'等。
在这个例子中我不使用/dev/video[0..n],也许它应该是另一个设备。
系统在raspbian jessie,php-5.6.14,php5- [dev,cli,cgi],lighttpd,swig-2.0.12下运行。根据phpinfo(),模块已成功加载。
有谁知道出了什么问题?
答案 0 :(得分:0)
我不认为对系统的两次调用不会像你那样连续运行。第一次调用的导出将仅影响针对system
的特定调用生成的的shell进程的环境。对系统的下一次调用将继承其父级的环境,该环境不会被更改。相反,您可能想要做的是:
system("LD_LIBRARY_PATH=/usr/local/lib/ mjpg_streamer -o 'output_http.so -w /media/MINIUSB/dev/Control/www' -i 'input_raspicam.so -x 640 -y 480 -fps 15'");
这将为调用mjpg_streamer的进程设置环境。或者更好的是使用putenv / setenv代替。
由于您正在使用PHP并且只是调用系统,因此您最好使用PHP shell_exec
或类似的,因为您的C中没有任何PHP无法做到的事情(它只是调用bash对你来说,这是一种方式)
答案 1 :(得分:0)
构建应用程序时,可以使用gcc -Wl,-rpath,/usr/local/lib ...
将rpath构建到.so中,而不是使用LD_LIBRARY_PATH。
正如@Flexo所指出的那样,设置环境变量的单独系统()不会影响后续调用system()的环境