Не удается запустить исполняемые файлы от nautilus

(предупреждение, которое появляется). На Ubuntu 18.04 я скомпилировал образец c ++, который включал только stdio.h и пустую главную функцию, используя g++ test.cpp -o test .

Ошибок не появилось, и у меня не было проблем с его запуском с терминала.

Однако, как только я пойду на nautilus и попытаюсь запустить его, нажав на test , появится предупреждение, в котором мне предлагается выбрать программу для открытия общей библиотеки.

Как я могу убедиться, что программа скомпилирована в качестве исполняемого файла / рассматривается в качестве исполняемого файла файловым менеджером?

Edit: stat output в исполняемом файле (перекомпилирован и изменено имя на asdff):

 File: asdff Size: 10600 Blocks: 24 IO Block: 4096 regular file Device: 808h/2056d Inode: 4200517 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 1000/ miguel) Gid: ( 1000/ miguel) Access: 2018-05-18 15:22:58.009993285 +0100 Modify: 2018-05-18 15:22:58.009993285 +0100 Change: 2018-05-18 15:22:58.009993285 +0100 Birth: - df output on the same executable: Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda8 128206036 102694048 18956444 85% / desktop entry: [Desktop Entry] Type=Application Encoding=UTF-8 Name=asdff Exec=./home/miguel/Desktop/asdff Icon=/home/miguel/Desktop/index.png 

Я замечаю, что вы пытались использовать файл рабочего стола. Это хорошо.

Поскольку Nautilus исправлен, чтобы удалить возможность выполнения программ. Это проблема безопасности.

Поместите свой рабочий стол в нужное место для запуска приложения и откройте его таким образом, а не с помощью Nautilus. Я считаю, что это местоположение $HOME/.local/share/applications .

Этот ответ предполагает, что ваша test программа находится в вашей домашней папке, и что /home имеет свой собственный раздел, с опцией noexec (это значение по умолчанию для Ubuntu).

man mount говорит:

noexec Не разрешать прямое выполнение каких-либо двоичных файлов на смонтированной файловой системе.

Это означает, что ваша система запрещает вам запускать тестовую программу в домашней папке.

Если это так, вы можете либо переместить вашу программу за пределы /home либо изменить способ монтирования домашнего раздела, отредактировав файл /etc/fstab . Посмотрите man fstab , но в основном вы хотите добавить опцию exec .


Другая гипотеза:

  1. По какой бы то ни было причине, ваша test программа не имеет предпродажного исполнения. Проверьте это с помощью $stat test .
  2. По какой-либо причине имя, которое вы дали вашей тестовой программе, выдает с помощью командного test командной строки оболочки. Переименуйте свою программу.

Запустите свою программу в эмуляторе терминала в командной строке , используя вашу интерактивную оболочку . Помните о переменной PATH (вы можете изменить ее, настроив вашу интерактивную оболочку, например, в ~/.bashrc ). Ваша shell будет использовать execve (2) (после globbing ) для запуска исполняемого двоичного файла (так что он должен оставаться на каком-то исполняемом разделе, как и ответил YSC, и быть исполняемым – см. Stat (2) ). Вы хотите видеть выходы stdout и stderr вашей программы. См. Также этот ответ.

Используйте g++ со всеми предупреждениями и информацией об отладке, поэтому g++ -Wall -Wextra -g . Избегайте именования test вашей программы (это имя конфликтует с тестом (1) ). Если ваш исполняемый файл использует другие библиотеки, вам может потребоваться указать некоторый rpath во время ссылки.

Только когда ваша программа является графической программой (например, для набора инструментов виджета, такого как Qt ), вы должны (в конечном счете) иметь возможность запускать ее на своем рабочем столе с помощью щелчка (подробности могут быть специфическими для среды вашего рабочего стола ). Вы будете беспокоиться об этом намного позже (и вы, вероятно, даже не должны, и оставите это бремя для своего пользователя или для упаковщика вашей программы).

Я уверен, что программа [….] рассматривается как исполняемый файл файловым менеджером?

Это вопрос sysadmin и может зависеть от вашего рабочего окружения или оконного менеджера . Сначала я не буду беспокоиться, но позже у вас может быть спецификация записи рабочего стола (некоторый файл, заканчивающийся на .desktop ), описывающий вашу программу. Поэтому используйте редактор для создания текстового файла asdff.desktop (он, вероятно, должен войти в ваш каталог $HOME/Desktop/ и должен содержать абсолютные пути к файлу).

 Exec=./home/miguel/Desktop/asdff 

. это опечатка, должна быть Exec=/home/miguel/Desktop/asdff без какой-либо точки.

Каждая программа в Linux запускается с помощью execve (2) (выполняется оболочкой, рабочей средой рабочего стола или какой-либо другой программой). Вы должны использовать оболочку в эмуляторе терминала для запуска большинства ваших программ , особенно при их разработке. И вы наверняка должны ожидать, что ваши пользователи будут запускать вашу программу со своей оболочкой (я ненавижу запуск программ с помощью мыши), возможно, в каком-то сценарии оболочки, сочетающем вашу программу с другими. Читайте также о философии Unix .