Не могу найти информацию, как clang-ом собрать бинарный файл для X11, чтобы он определялся не как "Разделяемая библиотека", а как "Исполняемый". То есть, чтобы приложение можно было "открыть" двойным кликом мышки в GIU файловом менеджере (Thunar, Nautilus и т.п.).
Для справки: как собрать бинарник под X11, определяемый файловым менеджером как "Исполняемый " при помощи GCC описано (ключ -no-pie) тут: Сборка GUI приложения в GCC для X-desktop. Но Clang так собирать отказывается: ключик "-fno-PIE" не работает.
Для тестирования я использую простое приложение с библиотекой gtkmm, которое создает одно GUI окошко:
Spoiler
Код: Выделить всё
#include <gtkmm.h>
class app_win: public Gtk::Window
{
public:
app_win();
virtual ~app_win() {}
protected:
Gtk::Box m_box { Gtk::ORIENTATION_VERTICAL };
Gtk::Label label { "Выход: <Esc>" };
private:
bool on_key_press_event (GdkEventKey* event) override;
};
app_win::app_win()
{
set_border_width(40);
add(m_box);
m_box.add(label);
show_all_children();
}
/// Обработчик нажатий клавиатуры
bool app_win::on_key_press_event(GdkEventKey* event)
{
if(event->keyval == GDK_KEY_Escape)
{
hide();
return true;
}
return Gtk::Window::on_key_press_event(event);
}
int main(int argc, char* argv[])
{
auto app = Gtk::Application::create(argc, argv, "");
app_win window {};
return app->run(window);
}
Spoiler
Код: Выделить всё
# По-умолчанию используется GCC
#
# Если надо Clang, то запускаем так:
# CC="clang" CXX="clang++" cmake ../ && cmake --build .
cmake_minimum_required( VERSION 3.15 )
project( SimpleTests )
SET( PROJECT_AUTHOR "bigov" )
SET( PROJECT_AUTHOR_EMAIL "bigov@yandex.ru" )
SET( APP "simple" )
if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR )
message(FATAL_ERROR "Prevented in-tree built. Please create a build \
directory outside of the source code and call cmake from there. Thank you.")
endif()
if( NOT CMAKE_BUILD_TYPE )
SET( CMAKE_BUILD_TYPE Debug )
endif()
SET( SKIP_INSTALL_ALL ON CACHE BOOL "" FORCE ) # Ничего не устанавливать
SET( CMAKE_CXX_STANDARD "20")
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -std=c++2a -Werror -Wall -Wextra \
-Wpedantic -Woverloaded-virtual -Winit-self -Wunreachable-code" )
# -Wconversion -Wold-style-cast -Wctor-dtor-privacy -Wnon-virtual-dtor -Weffc++" )
SET( CMAKE_TRY_COMPILE_TARGET_TYPE EXECUTABLE )
if( "_$ENV{CC}" MATCHES "clang" )
SET( CMAKE_C_COMPILER clang )
SET( CMAKE_CXX_COMPILER clang++ )
#SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-PIE" )
SET( SUFFIX "clang" )
else( "_$ENV{CC}" MATCHES "clang" )
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -no-pie" )
SET( SUFFIX "gcc" )
endif( "_$ENV{CC}" MATCHES "clang" )
SET( APP "${APP}_${SUFFIX}" )
if( ${CMAKE_SYSTEM_NAME} MATCHES "Windows" )
SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mwindows -Wl,-subsystem,windows" )
endif()
find_package( PkgConfig REQUIRED )
pkg_check_modules( GTKMM REQUIRED gtkmm-3.0 )
link_directories( ${GTKMM_LIBRARY_DIRS} )
include_directories( ${GTKMM_INCLUDE_DIRS} )
add_executable( ${APP} "main.cpp" )
target_link_libraries( ${APP} ${GTKMM_LIBRARIES} )
Чтобы уменьшить число "пустых советов", предлагаю считать:
- используемая графическая библиотека не влияет на результат,
- операционная система и версия ядра не влияет на результат (ps: как позже оказалось - не везде одинаково),
- бинарник создается всегда с атрибутами "исполняемый" и стартует из терминальной строки, но ФМ определяет по-своему,
- создание ярлыка ".desktop" решает проблему, но это не ответ на вопрос, а обход проблемы - "костыль", а ищется "решение".
Исходники:
--- --- ---
РЕШЕНИЕ:
Shell
--- CMakeLists.txt
+++ CMakeLists.txt
@@ -26,14 +26,13 @@ SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -std=c++2a -Werror -Wall -Wextra \
-Wpedantic -Woverloaded-virtual -Winit-self -Wunreachable-code" )
# -Wconversion -Wold-style-cast -Wctor-dtor-privacy -Wnon-virtual-dtor -Weffc++" )
SET( CMAKE_TRY_COMPILE_TARGET_TYPE EXECUTABLE )
+SET( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie" )
if( "_$ENV{CC}" MATCHES "clang" )
SET( CMAKE_C_COMPILER clang )
SET( CMAKE_CXX_COMPILER clang++ )
- #SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-PIE" )
SET( SUFFIX "clang" )
else( "_$ENV{CC}" MATCHES "clang" )
- SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -no-pie" )
SET( SUFFIX "gcc" )
endif( "_$ENV{CC}" MATCHES "clang" )
SET( APP "${APP}_${SUFFIX}" )