Qt C++:将所有库文件包含在项目文件夹中

Qt C++: Include all library files in project folder

本文关键字:项目 项目文件 文件夹 文件包 C++ Qt      更新时间:2023-10-16

使用Qt Creator,我创建了自己的个人共享库,目前正在我正在从事的项目中使用它。我想做的是将 .so/.dll 文件放在我在 .pro 文件中使用以下代码的应用程序的 lib/ 文件夹中:

LIBS += -L$$PWD/lib/
win32 {
    SHARED_LIB_FILES = $$files($$PWD/lib/*.dll)
    for(FILE, SHARED_LIB_FILES) {
        BASENAME = $$basename(FILE)
        LIBS += -l$$replace(BASENAME,.dll,)
    }
}
unix {
    SHARED_LIB_FILES = $$files($$_PRO_FILE_PWD_/lib/*.so)
    for(FILE, SHARED_LIB_FILES) {
        BASENAME = $$basename(FILE)
        LIBS += -l$$replace(BASENAME,.so,)
    }
}

但是当我构建项目时,对于库文件中使用的函数,我收到以下错误:

Undefined reference to 'Class::function()'

如何动态包含 lib/ 文件夹中的库文件而不会遇到上述错误?

更新

编译器输出:

09:56:53: Running steps for project PocketList...
09:56:53: Configuration unchanged, skipping qmake step.
09:56:53: Starting: "/usr/bin/make" 
g++ -m64 -Wl,-O1 -o PocketList main.o combotonselect.o ComListaCodigos.o ComEditor.o ComRecordatorio.o ComControlador.o Aplicacion.o ComNota.o ComElidedLabel.o ComDashPad.o AppRecordatorios.o AppCodigos.o ComVinchero.o AppVincheros.o Mod.o AppDashboard.o ComLogger.o ComLlave.o ComListaNotas.o AppNotas.o VentanaPrincipal.o AppConvertidorMetrico.o qrc_res.o moc_combotonselect.o moc_ComListaCodigos.o moc_ComEditor.o moc_ComRecordatorio.o moc_ComControlador.o moc_Aplicacion.o moc_ComNota.o moc_ComElidedLabel.o moc_ComResizeImageDialog.o moc_ComDashPad.o moc_AppRecordatorios.o moc_Control.o moc_AppCodigos.o moc_ComVinchero.o moc_AppVincheros.o moc_Mod.o moc_ObservadorVincheros.o moc_AppDashboard.o moc_ObservadorCuota.o moc_ObservadorConexion.o moc_ComLogger.o moc_ComLlave.o moc_ComListaNotas.o moc_AppNotas.o moc_VentanaPrincipal.o moc_AppConvertidorMetrico.o moc_WorkerObservadorVincheros.o moc_WorkerObservadorCuota.o moc_WorkerObservadorConexion.o   -L/usr/X11R6/lib64 -L/media/omari/EXT/Programación/Qt Creator/PocketList/lib/ -lQt5Multimedia -lQt5Widgets -lQt5Gui -lQt5Network -lQt5Core -lGL -lpthread 
main.o: En la función `ConvertidorMetrico::cargar()':
main.cpp:(.text._ZN18ConvertidorMetrico6cargarEv[_ZN18ConvertidorMetrico6cargarEv]+0x9b0): referencia a `Controlador::leerFichero(QString)' sin definir
main.cpp:(.text._ZN18ConvertidorMetrico6cargarEv[_ZN18ConvertidorMetrico6cargarEv]+0xa49): referencia a `Controlador::split(QString, QString)' sin definir
main.cpp:(.text._ZN18ConvertidorMetrico6cargarEv[_ZN18ConvertidorMetrico6cargarEv]+0xda1): referencia a `Controlador::split(QString, QString)' sin definir
main.cpp:(.text._ZN18ConvertidorMetrico6cargarEv[_ZN18ConvertidorMetrico6cargarEv]+0xf0b): referencia a `Controlador::split(QString, QString)' sin definir
Makefile:292: fallo en las instrucciones para el objetivo 'PocketList'
main.cpp:(.text._ZN18ConvertidorMetrico6cargarEv[_ZN18ConvertidorMetrico6cargarEv]+0x1100): referencia a `Controlador::split(QString, QString)' sin definir
AppRecordatorios.o: En la función `AppRecordatorios::guardar()':
AppRecordatorios.cpp:(.text+0x21b3): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppRecordatorios.o: En la función `AppRecordatorios::cargarDatos()':
AppRecordatorios.cpp:(.text+0x2ea1): referencia a `Controlador::leerFichero(QString)' sin definir
AppRecordatorios.cpp:(.text+0x3297): referencia a `Controlador::split(QString, QString)' sin definir
AppCodigos.o: En la función `AppCodigos::actualizarCodigos()':
AppCodigos.cpp:(.text+0xecf): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppCodigos.cpp:(.text+0x124b): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppCodigos.o: En la función `AppCodigos::cargarDatos()':
AppCodigos.cpp:(.text+0x16be): referencia a `Controlador::esDirExistente(QString)' sin definir
AppCodigos.cpp:(.text+0x1919): referencia a `Controlador::leerFichero(QString)' sin definir
AppCodigos.cpp:(.text+0x1c6a): referencia a `Controlador::leerFichero(QString)' sin definir
AppCodigos.cpp:(.text+0x1e42): referencia a `Controlador::crearDirectorio(QString)' sin definir
AppCodigos.o: En la función `AppCodigos::eliminarCodigo()':
AppCodigos.cpp:(.text+0x2ef7): referencia a `Controlador::eliminarArchivo(QString)' sin definir
AppCodigos.o: En la función `AppCodigos::addCodigo()':
AppCodigos.cpp:(.text+0x3214): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppVincheros.o: En la función `AppVincheros::guardar()':
AppVincheros.cpp:(.text+0x1709): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppVincheros.o: En la función `AppVincheros::getCantidadVinchero(QString, QString)':
AppVincheros.cpp:(.text+0x1e02): referencia a `Controlador::getVinculosURL(QString)' sin definir
AppVincheros.o: En la función `AppVincheros::addVinchero()':
AppVincheros.cpp:(.text+0x3e4c): referencia a `Controlador::esUrlValido(QString)' sin definir
AppVincheros.cpp:(.text+0x3f14): referencia a `Controlador::leerURL(QString)' sin definir
AppVincheros.o: En la función `AppVincheros::actualizarVinchero()':
AppVincheros.cpp:(.text+0x4744): referencia a `Controlador::esUrlValido(QString)' sin definir
AppVincheros.cpp:(.text+0x479b): referencia a `Controlador::leerURL(QString)' sin definir
AppVincheros.o: En la función `AppVincheros::cargarDatos()':
AppVincheros.cpp:(.text+0x4ee0): referencia a `Controlador::leerFichero(QString)' sin definir
AppDashboard.o: En la función `AppDashboard::configurarObservadorConexion()':
AppDashboard.cpp:(.text+0x328f): referencia a `Controlador::existeFichero(QString)' sin definir
AppDashboard.cpp:(.text+0x3315): referencia a `Controlador::leerFichero(QString)' sin definir
AppDashboard.o: En la función `AppDashboard::actualizarCuotaObservada()':
AppDashboard.cpp:(.text+0x432f): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppDashboard.cpp:(.text+0x4f1e): referencia a `Controlador::eliminarArchivo(QString)' sin definir
AppDashboard.o: En la función `AppDashboard::solicitarCuota(bool)':
AppDashboard.cpp:(.text+0x5a9a): referencia a `Controlador::hayConexion()' sin definir
AppDashboard.o: En la función `AppDashboard::configurarObservadorCuota()':
AppDashboard.cpp:(.text+0x6747): referencia a `Controlador::existeFichero(QString)' sin definir
AppDashboard.cpp:(.text+0x67cc): referencia a `Controlador::leerFichero(QString)' sin definir
AppDashboard.o: En la función `AppDashboard::actualizarCuotaObservada(Control::Cuota*)':
AppDashboard.cpp:(.text+0x7d6a): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppDashboard.o: En la función `AppDashboard::setProxyConexion()':
AppDashboard.cpp:(.text+0x8c03): referencia a `Controlador::eliminarArchivo(QString)' sin definir
AppDashboard.cpp:(.text+0x921b): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppDashboard.o: En la función `Control::getCuota(QString)':
AppDashboard.cpp:(.text._ZN7Control8getCuotaE7QString[_ZN7Control8getCuotaE7QString]+0xc2): referencia a `Controlador::leerURL(QString)' sin definir
ComLlave.o: En la función `ComLlave::autenticar()':
ComLlave.cpp:(.text+0x10e8): referencia a `Controlador::cifrarContrasenna(QString)' sin definir
ComLlave.o: En la función `ComLlave::cargarDatos()':
ComLlave.cpp:(.text+0x154b): referencia a `Controlador::leerFichero(QString)' sin definir
ComLlave.o: En la función `ComLlave::cambiarContrasenna()':
ComLlave.cpp:(.text+0x3392): referencia a `Controlador::cifrarContrasenna(QString)' sin definir
ComLlave.cpp:(.text+0x371a): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
ComLlave.cpp:(.text+0x3a3c): referencia a `Controlador::cifrarContrasenna(QString)' sin definir
ComLlave.cpp:(.text+0x3ca0): referencia a `Controlador::leerFichero(QString)' sin definir
AppNotas.o: En la función `AppNotas::guardar()':
AppNotas.cpp:(.text+0x11f2): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppNotas.cpp:(.text+0x1b73): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
AppNotas.o: En la función `AppNotas::cargarDatos()':
AppNotas.cpp:(.text+0x217f): referencia a `Controlador::esDirExistente(QString)' sin definir
AppNotas.cpp:(.text+0x21dc): referencia a `Controlador::crearDirectorio(QString)' sin definir
AppNotas.cpp:(.text+0x25bd): referencia a `Controlador::leerFichero(QString)' sin definir
AppNotas.cpp:(.text+0x2cb9): referencia a `Controlador::leerFichero(QString)' sin definir
AppNotas.o: En la función `AppNotas::eliminarCuaderno()':
AppNotas.cpp:(.text+0x48b9): referencia a `Controlador::eliminarArchivo(QString)' sin definir
AppNotas.o: En la función `AppNotas::eliminarNota()':
AppNotas.cpp:(.text+0x4b34): referencia a `Controlador::eliminarArchivo(QString)' sin definir
AppNotas.o: En la función `AppNotas::addNota()':
AppNotas.cpp:(.text+0x53e7): referencia a `Controlador::escribirFichero(QString, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)' sin definir
VentanaPrincipal.o: En la función `VentanaPrincipal::VentanaPrincipal(QWidget*)':
VentanaPrincipal.cpp:(.text+0x1015): referencia a `Controlador::esDirExistente(QString)' sin definir
VentanaPrincipal.cpp:(.text+0x15c7): referencia a `Controlador::crearDirectorio(QString)' sin definir
AppConvertidorMetrico.o: En la función `AppConvertidorMetrico::convertir(QString)':
AppConvertidorMetrico.cpp:(.text+0x3492): referencia a `te_interp' sin definir
AppConvertidorMetrico.cpp:(.text+0x3826): referencia a `te_interp' sin definir
moc_ObservadorVincheros.o: En la función `ObservadorVincheros::run()':
moc_ObservadorVincheros.cpp:(.text._ZN19ObservadorVincheros3runEv[_ZN19ObservadorVincheros3runEv]+0x28): referencia a `Controlador::hayConexion()' sin definir
moc_ObservadorVincheros.cpp:(.text._ZN19ObservadorVincheros3runEv[_ZN19ObservadorVincheros3runEv]+0x2fe): referencia a `Controlador::leerURL(QString)' sin definir
moc_ObservadorVincheros.cpp:(.text._ZN19ObservadorVincheros3runEv[_ZN19ObservadorVincheros3runEv]+0x5f7): referencia a `Controlador::getVinculosURL(QString)' sin definir
moc_WorkerObservadorVincheros.o: En la función `WorkerObservadorVincheros::process()':
moc_WorkerObservadorVincheros.cpp:(.text._ZN25WorkerObservadorVincheros7processEv[_ZN25WorkerObservadorVincheros7processEv]+0x28): referencia a `Controlador::hayConexion()' sin definir
moc_WorkerObservadorVincheros.cpp:(.text._ZN25WorkerObservadorVincheros7processEv[_ZN25WorkerObservadorVincheros7processEv]+0x2fe): referencia a `Controlador::leerURL(QString)' sin definir
moc_WorkerObservadorVincheros.cpp:(.text._ZN25WorkerObservadorVincheros7processEv[_ZN25WorkerObservadorVincheros7processEv]+0x5f7): referencia a `Controlador::getVinculosURL(QString)' sin definir
collect2: error: ld returned 1 exit status
make: *** [PocketList] Error 1
09:56:54: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project PocketList (kit: Linux)
The kit Linux has configuration issues which might be the root cause for this problem.
When executing step "Make"
09:56:54: Elapsed time: 00:01.

您在 LIBS 中包含 lib(来自库文件名(。试试这个:

BASENAME = $$basename(FILE)
LIBNAME = $$replace(BASENAME, lib, )
LIBS += -l$$replace(LIBNAME,.so,)

至少对于 unix 来说,约定是省略库文件名的 lib 前缀(例如 libname.so => -lname(

根据您发布的编译输出进行更新:

查看以 g++ 开头的行,您成功地将 lib 目录提供给链接器

-L/media/omari/EXT/Programación/Qt Creator/PocketList/lib/ 

但未能通过库,因为我看到的唯一库是那些:

-lQt5Multimedia 
-lQt5Widgets 
-lQt5Gui 
-lQt5Network 
-lQt5Core 
-lGL 
-lpthread
检查该目录

是否为该目录,并且是否包含所需的文件。此外,使用 pro 文件中message()函数来调试它。例如:

message( LIBNAME )