Flatpak-builder cmake cannot link external library

Mar 21, 2024
J

Hi,

I’ve tried to use flatpak-builder with cmake as buildsystem and try to link an external library. It build successfully with cmake directly, but with flatpak-builder it shows
the following error:

[ 97%] Linking CXX executable blink
/usr/lib/gcc/x86_64-unknown-linux-gnu/13.2.0/../../../../x86_64-unknown-linux-gnu/bin/ld: cannot find -lqscintilla2_qt6: No such file or directory
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/blink.dir/build.make:668: blink] Error 1
make[1]: *** [CMakeFiles/Makefile2:86: CMakeFiles/blink.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
Error: module blink: Child process exited with code 2

My build file, blink.yml

id: org.flatpak.blink
runtime: org.kde.Platform
runtime-version: '6.6'
sdk: org.kde.Sdk
finish-args:
  - --share=ipc
  - --socket=fallback-x11
  - --socket=wayland
  - --device=dri
modules:
  - name: blink
    buildsystem: cmake
    config-opts:
      - LIBS+=-L/opt/QScintilla_src-2.14.1/src
    sources:
      - type: dir
        path: /opt/blink
      - type: dir
        path: /opt/QScintilla_src-2.14.1/src/

And the CMakelist.txt

cmake_minimum_required(VERSION 3.1.0)

project(blink VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

if(CMAKE_VERSION VERSION_LESS "3.7.0")
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()

find_package(Qt6 COMPONENTS Widgets Xml Network REQUIRED)

set(CMAKE_AUTOUIC_SEARCH_PATHS Resources/Forms)

include_directories(. Utils /opt/QScintilla_src-2.14.1/src)

link_directories (/opt/QScintilla_src-2.14.1/src)

add_executable(blink
    Resources/Forms/mainWindow.ui
    Resources/Forms/editor.ui
    Resources/Forms/projectDialog.ui
    Resources/Forms/groupDialog.ui
    Resources/Forms/aboutDialog.ui
    Resources/Forms/configDialog.ui
    Resources/Forms/findReplaceDialog.ui
    Resources/Forms/editorFindDialog.ui

    Resources/app.qrc
    Resources/Icons/appIcons.rc 

    main.cpp
    Utils/CUtils.cpp
    Display/CMainWindow.cpp
    Display/CEditor.cpp
    Display/CEditorFindDlg.cpp
    Display/CProjectDlg.cpp
    Display/CAboutDlg.cpp
    Display/CProjectListWidget.cpp
    Display/CFileListWidget.cpp
    Display/CConfigDlg.cpp
    Display/CEventFilterObj.cpp
    Display/CSearchTextBrowser.cpp
    Display/CSearchTextEdit.cpp
    Display/CFindReplaceDlg.cpp
    Model/qTagger/CTagItem.cpp
    Model/qTagger/CTagFileRecord.cpp
    Model/qTagger/CTagResultItem.cpp
    Model/qTagger/qTagger.cpp
    Model/qTagger/CSourceFileList.cpp
    Model/qFindReplacer/qFindReplacer.cpp
    Model/CProjectListModel.cpp
    Model/CFileListModel.cpp
    Model/CProjectManager.cpp
    Model/CProjectUpdateThread.cpp
    Model/CProjectLoadThread.cpp
    Model/CConfigManager.cpp
    Model/CProjectItem.cpp
    Model/CFileItem.cpp
    Model/CRunCommand.cpp
    Model/CFindReplaceModel.cpp
    Storage/CXmlStorageHandler.cpp

)

target_link_libraries(blink Qt6::Widgets Qt6::Xml Qt6::Network qscintilla2_qt6)

Anyone has idea for that? Thanks a lot!

Regards,
Jan

F

I think you should get rid of /opt and make it a relative link

J
Replying to #2

Thanks for the suggestion. I’ve changed it to relative path but it still not success.

F

I think you should compile QScintilla separately like in one of these files:
https://github.com/search?q=org%3Aflathub+qscintilla&type=code

J

Thanks a lot for the suggestion! The QScintilla library can now be linked. But where can I find the output file? I’m not sure if it generate one. I’ve modified as follows:

CMakeLists.txt

cmake_minimum_required(VERSION 3.1.0)

project(blink VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

if(CMAKE_VERSION VERSION_LESS "3.7.0")
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
endif()

find_package(Qt6 COMPONENTS Widgets Xml Network REQUIRED)

set(CMAKE_AUTOUIC_SEARCH_PATHS Resources/Forms)

include_directories(. Utils /opt/QScintilla_src-2.14.1/src)

link_directories (/opt/QScintilla_src-2.14.1/src)

add_executable(blink
    Resources/Forms/mainWindow.ui
    Resources/Forms/editor.ui
    Resources/Forms/projectDialog.ui
    Resources/Forms/groupDialog.ui
    Resources/Forms/aboutDialog.ui
    Resources/Forms/configDialog.ui
    Resources/Forms/findReplaceDialog.ui
    Resources/Forms/editorFindDialog.ui

    Resources/app.qrc
    Resources/Icons/appIcons.rc 

    main.cpp
    Utils/CUtils.cpp
    Display/CMainWindow.cpp
    Display/CEditor.cpp
    Display/CEditorFindDlg.cpp
    Display/CProjectDlg.cpp
    Display/CAboutDlg.cpp
    Display/CProjectListWidget.cpp
    Display/CFileListWidget.cpp
    Display/CConfigDlg.cpp
    Display/CEventFilterObj.cpp
    Display/CSearchTextBrowser.cpp
    Display/CSearchTextEdit.cpp
    Display/CFindReplaceDlg.cpp
    Model/qTagger/CTagItem.cpp
    Model/qTagger/CTagFileRecord.cpp
    Model/qTagger/CTagResultItem.cpp
    Model/qTagger/qTagger.cpp
    Model/qTagger/CSourceFileList.cpp
    Model/qFindReplacer/qFindReplacer.cpp
    Model/CProjectListModel.cpp
    Model/CFileListModel.cpp
    Model/CProjectManager.cpp
    Model/CProjectUpdateThread.cpp
    Model/CProjectLoadThread.cpp
    Model/CConfigManager.cpp
    Model/CProjectItem.cpp
    Model/CFileItem.cpp
    Model/CRunCommand.cpp
    Model/CFindReplaceModel.cpp
    Storage/CXmlStorageHandler.cpp

)

target_link_libraries(blink Qt6::Widgets Qt6::Xml Qt6::Network qscintilla2_qt6)

set(CMAKE_INSTALL_PREFIX /opt/blinkApp)

install(TARGETS blink
    DESTINATION ${CMAKE_INSTALL_PREFIX}
    )

blink.yml

id: org.flatpak.blink
runtime: org.kde.Platform
runtime-version: '6.6'
sdk: org.kde.Sdk
finish-args:
  - --share=ipc
  - --socket=fallback-x11
  - --socket=wayland
  - --device=dri
build-options:
  prepend-ld-library-path: /opt/QScintilla_src-2.14.1/src
modules:
  - name: qscintilla
    buildsystem: qmake
    subdir: src
    sources:
      - type: archive
        url: https://www.riverbankcomputing.com/static/Downloads/QScintilla/2.13.4/QScintilla_src-2.13.4.tar.gz
        sha256: 890c261f31e116f426b0ea03a136d44fc89551ebfd126d7b0bdf8a7197879986
      - type: patch
        path: qscintilla-lib-paths.patch
  - name: blink
    buildsystem: cmake
    builddir: true
    config-opts:
      - -DCMAKE_BUILD_TYPE=RelWithDebInfo
      - -DCMAKE_INSTALL_LIBDIR:PATH=/app/lib
    sources:
      - type: dir
        path: /opt/blink

Console:

[ 83%] Building CXX object CMakeFiles/blink.dir/Model/CFileItem.cpp.o
[ 86%] Building CXX object CMakeFiles/blink.dir/Model/CRunCommand.cpp.o
[ 89%] Building CXX object CMakeFiles/blink.dir/Model/CFindReplaceModel.cpp.o
[ 91%] Building CXX object CMakeFiles/blink.dir/Storage/CXmlStorageHandler.cpp.o
[ 94%] Building CXX object CMakeFiles/blink.dir/blink_autogen/S5YYZ2ZCNV/qrc_app.cpp.o
[ 97%] Linking CXX executable blink
[100%] Built target blink
[  0%] Built target blink_autogen_timestamp_deps
[  2%] Built target blink_autogen
[100%] Built target blink
Install the project...
-- Install configuration: "RelWithDebInfo"
-- Installing: /opt/blinkApp/blink
-- Set non-toolchain portion of runtime path of "/opt/blinkApp/blink" to ""
Committing stage build-blink to cache
Cleaning up
Committing stage cleanup to cache
Finishing app
No executable found
Please review the exported files and the metadata
Committing stage finish to cache
Pruning cache
H

Get rid of /opt. It’s not a valid path in anyway. Amd it doesn’t belong anywhere in prepend-ld-library-path because that doesn’t exist inside the sandbox. Also I’m pretty this doesn’t do what you think it does.

The default build set the prefix to /app.