QML模块链接外部network库出现未定义引用错误,求正确链接方法
QML模块链接外部C静态库解决undefined_reference错误
问题
开发QML模块时,需要依赖另一个项目中的network静态库,但编译mysocket.cpp时出现undefined_reference错误。查阅了大量C++代码集成QML模块的资料,但未找到外部库链接的相关内容,需要定位问题并获取正确的链接方式。
项目结构
. ├── cppcomponents/ │ ├── mysocket.h │ ├── mysocket.cpp │ └── CMakeLists.txt ├── src/ │ └── main.cpp ├── CMakeLists.txt ├── Main.qml └── qmlmodules
原配置文件内容
根目录CMakeLists.txt
project(AppExample VERSION 0.1 LANGUAGES CXX) ... qt_standard_project_setup() qt_add_executable(${PROJECT_NAME} src/main.cpp ) include (qmlmodules) ...
qmlmodules文件
qt_add_qml_module(AppExample URI "Main" VERSION 1.0 NO_PLUGIN QML_FILES Main.qml ) add_subdirectory(cppcomponents) target_link_libraries(AppExample PRIVATE CppComponentsplugin )
src/main.cpp
... Q_IMPORT_QML_PLUGIN(cppcomponentsPlugin) int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.loadFromModule("Main", "Main"); return app.exec(); }
cppcomponents/CMakeLists.txt
# this is the way i add libs to another libs/executable set(LIBS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../libs") add_subdirectory("${LIBS_DIR}/network" "${CMAKE_CURRENT_BINARY_DIR}/network") # and than i use target_link_directories(...) qt_add_library( CppComponents # network <- i tried to link it here STATIC # <- or here ) qt_add_qml_module(CppComponents URI "cppcomponents" VERSION 1.0 SOURCES mysocket.h mysocket.cpp
network库CMakeLists.txt
project(network LANGUAGES C) ... add_library(${PROJECT_NAME} STATIC ${NETWORK_LIBS}) ...
错误原因
核心问题是CppComponents静态库未正确链接network库。虽然通过add_subdirectory引入了network库的构建,但没有将network库与CppComponents建立链接关系,导致mysocket.cpp中调用network库的符号在编译时无法被解析,从而抛出undefined_reference错误。
正确链接方式
修改cppcomponents/CMakeLists.txt,在创建CppComponents库后,通过target_link_libraries将network库链接到CppComponents上:
set(LIBS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../libs") add_subdirectory("${LIBS_DIR}/network" "${CMAKE_CURRENT_BINARY_DIR}/network") qt_add_library(CppComponents STATIC) qt_add_qml_module(CppComponents URI "cppcomponents" VERSION 1.0 SOURCES mysocket.h mysocket.cpp ) # 关键:将network静态库链接到CppComponents target_link_libraries(CppComponents PRIVATE network) # 若network库的头文件不在系统默认路径,需添加包含目录 # target_include_directories(CppComponents PRIVATE "${LIBS_DIR}/network/include")
说明
- 因为CppComponents是静态库,当最终可执行文件
AppExample链接CppComponents时,network库的符号会被一并引入,解决符号未定义问题。 - 若network是动态库,链接方式相同,但需确保运行时能找到动态库文件(可通过
CMAKE_INSTALL_RPATH等配置)。
内容的提问来源于stack exchange,提问作者Maleno
相关产品推荐
相关产品推荐

