Екі OpenCV нұсқасы: біреуіне жаңарту екіншісін бұзды, бірақ олар бөлек болуы керек

Это настолько эффективно, насколько это возможно.

Вы можете увидеть, какие системные вызовы выполняет оболочка, посмотрев на strace (или эквивалент в вариантах unix, кроме Linux).

strace bash -c '[[ -d $directory_path && -r $directory_path && -x $directory_path ]]'
…
stat64("foo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
faccessat(AT_FDCWD, "foo", R_OK)        = 0
faccessat(AT_FDCWD, "foo", X_OK)        = 0
…

Это почти так же хорошо, как и получается.Один системный вызов для проверки типа файла ( -d ) и один системный вызов для проверки всех разрешений. Хотя bash может попытаться вывести права доступа из файлового режима, это будет работать только в системах без списков управления доступом.

Два звонка на faccessat могут быть объединены; ни bash, ни ksh, ни dash не достаточно умны для этого. Но выигрыш будет минимальным. Inode будет в кеше, поэтому стоимость повторных системных вызовов будет чрезвычайно низкой. Если бы вам действительно была нужна такая микроэффективность, вы бы вообще не писали сценарий оболочки.

0
22.03.2018, 14:27
1 ответ

Для меня, используя virtualenv, export LD_LIBRARY_PATH=/usr/lib/atlas-base/:${LD_LIBRARY_PATH}в конце моего .bashrcфайла исправил это.

-121 ---32535 ​​-

Проблемы, с которыми я столкнулся, устранены. В одном я не уверен. Другой был результатом моего собственного невежества. Что касается странных ошибок компиляции, которые я испытывал с OpenCV 2 и более простой из двух программ, я не уверен. Однако перекомпиляция OpenCV 2, похоже, решила проблему.

Самая большая ошибка, которую я совершил, была связана с make-файлом. Я не знал, что псевдонимы, определенные в.bashrc, не транслируются в make-файлы и что make-файлы имеют совсем другой синтаксис по сравнению с bash. В bash $(opencv2)вызывает команду, на которую ссылается opencv2, и использует ее вывод в текущей команде. Использование $opencv2будет ссылаться на переменную и возвращать ее значение. В makefile это не так. На самом деле $(opencv2)возвращает значение локально определенной переменной с именем opencv2. Команды могут быть определены этими переменными, но должны быть окружены обратными кавычками/метками. Ниже приведен мой исправленный make-файл:

OPENCV=`pkg-config --cflags --libs opencv2`
segmentation : main.cpp Loader.o MeanShift.o ControlParameters.h defs.h
         g++ -g main.cpp Loader.o MeanShift.o $(OPENCV) -o segmentation      

Loader.o : Loader.cpp Loader.h
         g++ -g -c Loader.cpp $(OPENCV)

MeanShift.o : MeanShift.cpp MeanShift.h
         g++ -g -c MeanShift.cpp $(OPENCV)

clean:
         rm segmentation *.o
0
28.01.2020, 04:27

Теги

Похожие вопросы