QT creator using static library - c++

I am trying to follow qt creators instructions to create static libraries.
https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application
it shows the below for lines to include in my libraries .pro
TEMPLATE = lib
CONFIG += staticlib
# Input
HEADERS += test.h
SOURCES += test.cpp
and for the apps .pro
TEMPLATE = app
TARGET =
CONFIG += console
# Input
SOURCES += main.cpp
INCLUDEPATH += ../staticLibrary
LIBS += -L../staticLibrary/debug -lstaticLibrary
I have
library's .pro
QT -= gui
TARGET = test
TEMPLATE = lib
CONFIG += staticlib
SOURCES += test.cpp
HEADERS += test.h
unix {
target.path = /usr/lib
INSTALLS += target
}
app's .pro
QT += core
QT -= gui
CONFIG += c++11
TARGET = TestLink
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += ../test // ADDED BY ME
LIBS += -L../test/debug -ltest //ADDED BY ME
// LIBS += -L../test/debug -ltest.a //ALSO TRIED .a
My library is test. Both folder, the main app and the library are in the same folder. When I now include the .h
#include "test.h"
I get
C:\CPP\Test\TestLink\main.cpp:3: error: C1083: Cannot open include file: 'test.h': No such file or directory
It seems I am following the isntructions here. What am I missing?
This here also suggests the two lines I added should do the job
Using a static library in Qt Creator

Related

Can't step into/break on my code with qt creator

I have created a project in qt creator with multiple subdirs and am deploying/running it on a beaglebone. Compiles fine, deploys fine, etc.
My issue is that when I try to debug, the only files I can set breakpoints in or step into are those in the same subdir where main.cpp is. Just to test, I duplicated the project with a flat folder structure and can set breakpoints and step into everything.
When the debugger starts up, the debug log tries to set the breakpoints and fails seemingly because it can't find the .cpp files:
"No source file named projectdir/dir1/myclass.cpp.\n"
8045^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="",pending="\"projectdir/dir1/myclass.cpp\":7",times="0",original-location="\"fullpathofprojectdir/dir1/myclass.cpp\":7"}
Whereas it says this for breakpoints in main:
8046^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="0x0001831c",func="main(int, char**)",file="projectdir/dir2/main.cpp",fullname="fullpathofprojectdir/dir2/main.cpp",line="27",thread-groups=["i1"],times="0",original-location="fullpathofprojectdir/dir2/main.cpp:27"}
Additionally, myclass.cpp doesn't show up in the source files panes either. How can I resolve this?
Here is the setup of my *.pro files:
Top level project file:
TEMPLATE = subdirs
SUBDIRS += \
dir1 \
dir2
unix {
target.path = /home/debian
INSTALLS += target
}
Project file of library (dir1, myclass.cpp, etc):
QT -= gui
TARGET = Common
TEMPLATE = lib
DEFINES += COMMON_LIBRARY
SOURCES += \
myclass.cpp
HEADERS += \
common_global.h \
myclass.h
unix {
target.path = /home/debian/lib
INSTALLS += target
}
CONFIG += debug
Project file containing main:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Test
TEMPLATE = app
SOURCES += \
main.cpp
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../Common/release/
-lCommon
else:win32:CONFIG(debug, debug|release): LIBS += -
L$$OUT_PWD/../Common/debug/ -lCommon
else:unix: LIBS += -L$$OUT_PWD/../Common/ -lCommon
INCLUDEPATH += $$PWD/../Common
DEPENDPATH += $$PWD/../Common
target.path = /home/debian
INSTALLS += target
Let me know if there's any other relevant data I forgot to provide. Qt Creator version is 4.5.0 and I'm running it on a 64 bit VM of ubuntu 16.04 if that's relevant.

Qmake -= operator not working correctly

I have a Qt project which I want to include all of my source files bar one.
SOURCES += $$files(*.cpp)
SOURCES -= excluded.cpp
I have tried using the wildcard directly
SOURCES += *.cpp
The strange thing is that if i print out the value of SOURCES the file is not printed, however it is still built with the rest of the project:
message($$SOURCES) # doesn't show excluded.cpp
Any help would be greatly appreciated!
EDIT:
Here is my full .pro:
TEMPLATE = app
CONFIG += console c++17
CONFIG -= app_bundle
CONFIG -= qt
SOURCES += $$files(../compiler/src/*.cpp)
SOURCES -= ../compiler/src/main.cpp
SOURCES += test.cpp
INCLUDEPATH = ../compiler/include
HEADERS += $$files(../compiler/include/*.h)
LIBS += -lgtest -lgmock -pthread
QMAKE_CXXFLAGS += -std=c++1z

undefined reference to own library function

I'm using QT(5)-Creator with 2 projects, that compile both with MinGW my C++ programs under Windows 7. One project generates a static library, and the other is just there to verify that the library is alright.
The error:
When building the library no errors are generated and it creates successfully the static lib MyClassName.a.
In turn, when trying to import the library, I get error messages durring building/compilation:
undefined reference to 'MyClassName::MyClassName()'
undefined reference to 'MyClassName::MyClassFunction()'
The files:
here's the main.cpp of my importer project
#include <QCoreApplication>
#include "MyClassName.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
MyClassName *mainThread = new MyClassName();
mainThread->MyClassFunction();
return a.exec();
}
and it's .pro file
QT += core
QT += widgets
QT -= gui
TARGET = TESTerase
CONFIG += console
CONFIG -= app_bundle
CONFIG +=extserialport
CONFIG +=staticlib
TEMPLATE = app
HEADERS += \
MyClassName.h
SOURCES += main.cpp
unix:!macx: LIBS += -L$$PWD/../MyClassName-Release/ -lMyClassName
INCLUDEPATH += $$PWD
INCLUDEPATH += $$PWD/../MyClassName-Release/release
DEPENDPATH += $$PWD/../MyClassName-Release/release
unix:!macx: PRE_TARGETDEPS += $$PWD/../MyClassName-Release/release/MyClassName.a
btw I've used QT-Creator's include external library function
My guesses:
Since I'm able to [Strg+Click] the functions in the main, I assume the error is thrown by the Linker.
It may also be a manner of importing/creating/using libraries too, since I just started with that topic.
Anyways searching the Internet about it usually just results in the hint, to use the same compiler for both projects - which shouldn't matter in my case (since I'm building both projects with the same Creator and the same settings).
Has anybody an idea?
Thanks for your support
Kind Regards
[Update for Bogdans request]
the new .pro file
#-------------------------------------------------
#
# Project created by QtCreator 2015-04-29T19:46:22
#
#-------------------------------------------------
QT += core
QT += widgets
QT -= gui
TARGET = TESTerase
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG +=extserialport
HEADERS += \
MyClassName.h
SOURCES += main.cpp
unix:!macx: LIBS += -L$$PWD/../MyClassName-Release/ -lMyClassName
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../MyClassName-Release/release/ -lMyClassName
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../MyClassName-Release/debug/ -lMyClassName
else:unix:!macx: LIBS += -L$$PWD/../MyClassName-Release/ -lMyClassName
INCLUDEPATH += $$PWD/../MyClassName-Release/release
DEPENDPATH += $$PWD/../MyClassName-Release/release
win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../MyClassName-Release/release/MyClassName.a
else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../MyClassName-Release/debug/MyClassName.a
else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../MyClassName-Release/release/MyClassName.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../MyClassName-Release/debug/MyClassName.lib
else:unix:!macx: PRE_TARGETDEPS += $$PWD/../MyClassName-Release/MyClassName.a
Your .pro file defines library dependencies only for unix platform unix:!macx:. I suppose there should be also win32 for Windows.
Had the same problem just now. Build was working fine on macOS/OSX but not on Windows with the same codebase.
It was caused by the fact I was not exporting my symbols, which is necessary on Windows.
Use Q_DECL_EXPORT on functions when building the lib.
And use Q_DECL_IMPORT when using the functions from the lib.
Example how to do this here: https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application#Creating_a_shared_library
Solved the problem in my case, hope it helps!

QT Creator: How to generate the library and testing executable for a custom widget

There is the following files:
MyWidget
|- MyWidget.cpp
|- MyWidget.hpp
|- MyWidget_UnitTest.cpp
I would like to generate at once following files:
MyWidget.dll (or equivalent for non windows OS)
MyWidget_UnitTest.exe (or equivalent for non windows OS)
So it is easy to test the widget for bugs, but also to have the result inside further widgets or projects.
I tried to manipulate the .pro file, but with no success:
# ONLY TESTING UNIT
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MyWidget_UnitTest
TEMPLATE = app
SOURCES +=\
MyWidget.cpp \
MyWidget_UnitTest.cpp
HEADERS += \
MyWidget.hpp
CONFIG += c++11 -Wall
#ONLY LIB
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = MyWidget_UnitTest
TEMPLATE = lib
SOURCES +=\
MyWidget.cpp \
MyWidget_UnitTest.cpp
HEADERS += \
MyWidget.hpp
CONFIG += c++11 -Wall
CONFIG += dll
I am unable to merge both into a single project.
Possibly more result could be added: static vs dynamic lib, etc.
Use the SUBDIRS project organization.
project_dir/
src/
your_dll/
... sources, headers ...
your_dll.pro
your_exe/
... sources, headers ...
your_exe.pro
project_dir.pro
project_dir.pro
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += src/your_dll
SUBDIRS += src/your_exe
your_exe.depends = your_dll
your_exe.pro
TARGET = your_exe
TEMPLATE = app
QT += widgets
LIBS += -L$${YOUR_DLL_PATH} -lyour_dll
etc...
your_dll.pro
TARGET = your_dll
TEMPLATE = lib
QT += widgets
etc...
Now when you build, the DLL and EXE will be built, and the EXE will be linked to the DLL.
Use different CONFIG flags:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
SOURCES +=MyWidget.cpp
HEADERS += MyWidget.hpp
CONFIG += c++11 -Wall
testmode {
# ONLY TESTING UNIT
TARGET = MyWidget_UnitTest
SOURCES += MyWidget_UnitTest.cpp
TEMPLATE = app
}
libmode {
#ONLY LIB
TARGET = MyWidget
TEMPLATE = lib
CONFIG += dll
}
To build both:
qmake "CONFIG+=libmode"
make
qmake "CONFIG+=testmode"
make

Qt cannot open Lib file - LNK1104 Cannot open file 'DbManager.lib'

I am using QT Creator 2.7.0 based upon QT 5.0.2 on a Windows 7 machine and attempted to create a subdirs project with three sub-projects.
Project_Dir
- DbManager
- Gui
- Build
Using the example here How to use qmakes subdirs template, I created the Project files listed below, however, upon building I keep getting the error LNK1104 Cannot open file 'DbManager.lib'
My search usually yeilds results for Visual Studio type fixes, but no QT fixes
Project.pro
TEMPLATE = subdirs
SUBDIRS += \
DbManager \
Gui
CONFIG += ordered
SUBDIRS += Build
DbManager.pro
! include( ../common.pri ) {
error( Couldnt find the common.pri file! )
}
HEADERS += dbmanager.h
SOURCES += dbmanager.cpp
Gui.pro
! include( ../common.pri ) {
error( Couldnt find the common.pri file! )
}
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = target
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
Build.pro
TEMPLATE = app
DEPENDPATH += ../Gui
INCLUDEPATH += ../Gui
DEPENDPATH += ../DbManager
INCLUDEPATH += ../DbManager
LIBS += -L../DbManager -L../Gui -lDbManager -lGui
SOURCES += main.cpp
TARGET = ../OptionsTrader
QT += widgets
The following "Common.pri" file, was also included:
INCLUDEPATH += . ..
WARNINGS += -Wall
TEMPLATE = lib
UI_DIR = uics
MOC_DIR = mocs
OBJECTS_DIR = objs
I got the same problem before, and I just copy the lib file into the project working directory,it worked.