Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Undefined refence to "main"



  • Hello,
    I'm trying to build a QT project but i'm getting
    "/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/Scrt1.o: In function _start': (.text+0x20): undefined reference tomain'"

    Here is the structure of my project :
    ├── MainPro.pro
    ├── MainPro.pro.user
    ├── app
    │   ├── app.pro
    │   └── main.cpp
    ├── default.pri
    ├── src
    │ ├── src.pro
    │   ├── algorithms
    │   │   ├── AlgorithmsFiles.cpp
    │   ├── data_models
    │   │   ├── data_models.cpp
    │   │   ├── data_models.h
    │   ├── data_models.o
    │   ├── data_structures
    │   │   ├── data_structures.cpp
    │   │   ├── data_structures.h
    │   ├── data_structures.o
    │   ├── widgets
    │   │   ├── widgetsFiles.h
    │ │ ├── widgetsFiles.cpp
    │   └── writing.o
    └── test
    │ ├── main.cpp
    │ └── test.pro

    And here is my .pro files :

    default.pri :
    INCLUDEPATH += ../src
    SRC_DIR = ../src

    MainPro.pro :
    TEMPLATE = subdirs

    SUBDIRS =
    src
    app \

    app.depends = src

    OTHER_FILES += default.pri

    src.pro :

    TEMPLATE = app
    TARGET = src
    INCLUDEPATH += .
    QT += widgets

    HEADERS += algorithms/AlgorithmsFiles.h
    widgets/widgetsFiles.h
    SOURCES += algorithms/AlgorithmsFiles.h
    widgets/widgetsFiles.h

    Thanks in advance


  • Lifetime Qt Champion

    Hi,

    You tell in your src.pro that the template is an application however, you don't provide any main function hence the error.

    If you want to reuse what you have in src in your app then you should make it a library and link to that library.



  • Hello SGaist and thanks for your help,
    Unfortunately I don't get what I should do precisely from your message. This application works as is on an other computer I'm just trying to rebuild it on a different environment.


  • Lifetime Qt Champion

    Then you should explain what you are currently expecting to build from that src project.



  • I'm trying to build an executable which is an interface using widgets. Sorry if my answers are not clear I usually uses cmake and not qmake so I'm not used to those .pro files and this structure of project.


  • Lifetime Qt Champion

    Well, if you are used to cmake, you can continue using it. There's no need to switch over to qmake especially since Qt 6 build system will be cmake.

    You can find here the CMake manual for Qt projects.

    However, if you really want to use qmake, then from the structure you are showing it seems that you would like to have:

    • One application project which is app
    • One library project which is src (and that you are currently trying to build as an app)

    Based on the test folder, it seems that you would like to do some unit testing (which is very good) so do you want to test your application or your library ?



  • Hello SGaist,

    I think I need to give you more detail about the project. So I have a first computer where this project is build as if (so with the src part building as an application and not as a library) using QT creator. On this computer we just load the project by opening MainPro.pro, compute it and launch it inside QT creator.

    Now on my computer I'm trying to do the same thing. The test folder is indeed a unit testing used to test so algorithms from the src part. In QT creator i get some errors so I tried first to compile outside using qmake. I'll try to solve those errors directly inside Qt creator as compiling outside of it seemed to be a bad idea. I'll let you know if I can find what s wrong.

    Thanks again for your help



  • It seems that the issue might just be cause by the fact dataChanged is not recognize, I tried to add QT+=core in my .pro files but it doesn't solve the issue



  • So in some files I have a line :
    emit dataChanged(index,index, {Qt::DisplayRole, Qt::EditRole});
    and the dataChanged function doesn't seem to accept the third argument



  • Additionnally I get :

    no matching function for call to ‘SolutionPoolModel::connect(SolutionPoolModel*, void (QAbstractItemModel::)(const QModelIndex&, const QModelIndex&), SolutionPoolModel::SolutionPoolModel(ParametersSet, QObject*)::<lambda(const QModelIndex&, const QModelIndex&, const QVector<int>&)>)’

         connect(this, &SolutionPoolModel::dataChanged, [this](const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles){Q_UNUSED(topLeft) Q_UNUSED(bottomRight) Q_UNUSED(roles) this->updateMakespanBoundaries();});
                                                                                                                                                                                                                                                ^


  • @R-griset
    Although these can be addressed, do you know what version of Qt, and possibly what version of which compiler, this code has been developed using?


  • Lifetime Qt Champion

    @R-griset said in Undefined refence to "main":

    void (QAbstractItemModel::)(const QModelIndex&, const QModelIndex&),

    This is Qt4 ... you mix Qt4 and Qt5 include files.



  • Ok thanks to your advices I switched the Qt version used to build from 4 to 5 (this code has been developed with QT5 )

    However I'm still ahving the error

    41ccedf9-a7ba-4031-a81d-519314183e13-image.png
    c6f2724e-a9ab-4774-b95c-e30996e41c41-image.png



  • I think the error probably comes from the fact qmake is called with -qt4 option but I can't figure out how to change it

    8e86c934-caa4-45c0-acc0-449e48777669-image.png


  • Lifetime Qt Champion

    Select the correct qmake for the correct Qt5 kit under 'Qt versions'



  • Hello Christian Ehrlicher and thanks for helping

    Ok i changed the kit but now i'm getting back to my initial issue which I encountered outside of Qt creator : the undefined reference to main :(

    13:35:55: Running steps for project anchorage...
    13:35:55: Configuration unchanged, skipping qmake step.
    13:35:55: Starting: "/usr/bin/make"
    cd src/ && ( test -e Makefile || /usr/lib/x86_64-linux-gnu/qt5/bin/qmake /home/d07876/Desktop/Ancrage/Code\ interface\ graphique\ ancrage/UI_11_05/src/src.pro -spec linux-g++-64 CONFIG+=debug CONFIG+=qml_debug -o Makefile ) && /usr/bin/make -f Makefile
    make[1]: Entering directory '/home/d07876/Desktop/Ancrage/Code interface graphique ancrage/build-anchorage-QT5-Debug/src'
    g++ -m64 -o src heuristics.o longest_paths.o manual_modification.o metaheuristics.o resource_flow_computation.o resource_flow_modifications.o data_models.o data_structures.o resource_flow.o parsing.o writing.o central_widget.o central_widget_solution_tab.o gantt_view.o mainwindow.o parameters_bar.o parameters_edition_dialog.o resource_view.o sidebar.o sidebar_list.o solution_pool_view.o moc_data_models.o moc_central_widget.o moc_central_widget_solution_tab.o moc_gantt_view.o moc_mainwindow.o moc_parameters_bar.o moc_parameters_edition_dialog.o moc_resource_view.o moc_sidebar.o moc_sidebar_list.o moc_solution_pool_view.o -L/usr/X11R6/lib64 -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
    /usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/Scrt1.o: In function _start': (.text+0x20): undefined reference tomain'
    Makefile:228: recipe for target 'src' failed
    make[1]: Leaving directory '/home/d07876/Desktop/Ancrage/Code interface graphique ancrage/build-anchorage-QT5-Debug/src'
    Makefile:43: recipe for target 'sub-src-make_first' failed
    collect2: error: ld returned 1 exit status
    make[1]: *** [src] Error 1
    make: *** [sub-src-make_first] Error 2
    13:35:56: The process "/usr/bin/make" exited with code 2.
    Error while building/deploying project anchorage (kit: QT5)
    When executing step "Make"
    13:35:56: Elapsed time: 00:01.


  • Lifetime Qt Champion

    @R-griset please remove all build artifacts and build again.

    Regards


  • Lifetime Qt Champion

    In your src.pro you tell qmake that you want to build an application but you do not provide a main() function there (I would guess)



  • @Christian-Ehrlicher but this exact code work perfectly on an other computer so there should be a setting which doesn't need a main function there


  • Lifetime Qt Champion

    @R-griset said in Undefined refence to "main":

    so there should be a setting which doesn't need a main function there

    Yes, don't tell qmake that you want to create an application... an application needs a main.



  • When I do so i.e replacing TEMPLATE = app by TEMPLATE = lib in the src.pro file , it leads to other errors.

    In an other computer it work with TEMPLATE = app without this "undefined reference to main" issue so I'm looking for an explanation about how QT creator build the project in the other computer.



  • @Christian-Ehrlicher when I define src as a library I get

    /usr/bin/ld: cannot find -lmyapp
    Makefile:127: recipe for target 'app' failed
    make[1]: Leaving directory '/home/d07876/Desktop/Ancrage/Code interface graphique ancrage/build-anchorage-QT5-Debug/app'
    Makefile:68: recipe for target 'sub-app-make_first' failed
    collect2: error: ld returned 1 exit status
    make[1]: *** [app] Error 1
    make: *** [sub-app-make_first] Error 2
    15:01:17: The process "/usr/bin/make" exited with code 2.
    Error while building/deploying project anchorage (kit: QT5)
    When executing step "Make"



  • it seems to come from the fact that line

    "LIBS += -L../src -lmyapp" in app.pro file is not recognize when src.pro is define as a library


  • Lifetime Qt Champion

    As already pointed out earlier, your project, as it is can not compile.

    As for your LIBS statement, the library is generated in the shadow build folder, not in your sources where you are pointing it to. Use the OUT_PWD variable as starting folder.



  • Hello SGaist and merry Christmas,

    Thanks again for your help but once again I can't figure out what you want me to do exactly. So here is how I understood your advice :

    • As you told me in one of your first post I need to set "TEMPLATE = lib" instead of "TEMPLATE = app" in my src.pro file
    • Now when I compile the compiler doesn't find -lmyapp (by the way I don't know if "myapp" is a generic name ) because in my app.pro file I point to ../src in line "LIBS += -L../src -lmyapp"
    • Instead of ../src I tried $OUT_PWD or $OUT_PWD/src but the compiler still doesn't find -lmyapp :(

    I guess I didn't understand your post


  • Lifetime Qt Champion

    @R-griset said in Undefined refence to "main":

    As you told me in one of your first post I need to set "TEMPLATE = lib" instead of "TEMPLATE = app" in my src.pro file

    If you want to build a library, use the former one, if you want to build a program, use "app".

    Now when I compile the compiler doesn't find -lmyapp (by the way I don't know if "myapp" is a generic name )

    You tell the linker to link against a library libmyapp.so, and -L specifies the path to this library. So check if you have such a library (and where!), and if it already exists at the time the linker is invoked.

    By the way: /home/d07876/Desktop/Ancrage/Code interface graphique ancrage/build-anchorage-QT5-Debug/app'

    I strongly advice against project paths containing spaces or other special characters! Already this small piece might lead to build, debug or deploy errors.

    Regards



  • Hello aha_1980 and thanks for your advices,

    No I don't have "libmyapp.so" anywhere because it should be compile from src folder and call by the application from app folder. At the beggining in the code it was written "app" but it doesn't compile because it is looking for a main function which doesn't exist in src.

    Thanks for the advice about the folder name, once again it s not my project but I changed the name ;)


  • Lifetime Qt Champion

    That's the main issue here: the project as written by default can't compile because what you have in the arc folder should be built as a library and that library linked to your application.

    If anything, I would recommend starting by cleaning up the project structure so you have something clear to use.



  • Ok lets try :),

    I compiled src as lib appart and i'm having a libsrc.so in a build-src-QT5-Debug folder

    Now, I removed src folder from the MainPro.pro and I added the line

    LIBS += -L../build-src-QT5-Debug/ -lsrc in my app.pro file

    And i'm still getting an error :

    14:32:57: Starting: "/usr/bin/make"
    cd app/ && ( test -e Makefile || /usr/lib/x86_64-linux-gnu/qt5/bin/qmake /home/d07876/Desktop/Ancrage/UIAncrage/UI_11_05_test1Folder/app/app.pro -spec linux-g++-64 CONFIG+=debug CONFIG+=qml_debug -o Makefile ) && /usr/bin/make -f Makefile
    make[1]: Entering directory '/home/d07876/Desktop/Ancrage/UIAncrage/build-anchorage-QT5-testLibAppart/app'
    /usr/lib/x86_64-linux-gnu/qt5/bin/qmake -spec linux-g++-64 CONFIG+=debug CONFIG+=qml_debug -o Makefile ../../UI_11_05_test1Folder/app/app.pro
    g++ -Wl,-rpath,'$ORIGIN/../src',--enable-new-dtags -o app main.o -L/usr/X11R6/lib64 -L../build-src-QT5-Debug/ -lsrc -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
    /usr/bin/ld: cannot find -lsrc


  • Lifetime Qt Champion

    As already suggested use OUT_PWD to have a full path to the folder where the library can be found.



  • But if I compile src appart from app then the OUT_PWD variable doesn't lead to the right path, no ?


  • Lifetime Qt Champion

    How are you building it ?



  • Maybe we are missunderstanding from the very beginning, src.pro is not a library but only the sources of the project, in app folder you have nothing except a main function directly calling function from src folder. I think my predecessor who wrote the code just separate it to be clearer and that's why the TEMPLATE was app because it is an app whose source files are in src folder.

    I'm building it by opening directly the src.pro as a project and building it as a library before trying to build the app



  • I think I found it !! I just created a new project and copy/paste all files from src into it, after some settings it seems to compile.

    I'll test if everything works but I'm probably close from success ;)



  • It works :D thanks all and especially SGaist for all your help


Log in to reply