使用cmake创建的自定义库中对“vtable”的未定义引用
我得到了错误:lib/libhrlLib.so:对'hrlQseqDev::waiting(bool,int)'的未定义引用以及其他一些错误。。。 我试图用cmake(3.7.2)而不是qmake(Qt5)来构建我的项目 CMakeLists.txt:使用cmake创建的自定义库中对“vtable”的未定义引用,cmake,qt5,Cmake,Qt5,我得到了错误:lib/libhrlLib.so:对'hrlQseqDev::waiting(bool,int)'的未定义引用以及其他一些错误。。。 我试图用cmake(3.7.2)而不是qmake(Qt5)来构建我的项目 CMakeLists.txt: project(${TARGET_NAME}) cmake_minimum_required(VERSION 3.1 FATAL_ERROR) set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_INCLUDE_
project(${TARGET_NAME})
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD 14)
set(POSITION_INDEPENDENT_CODE FALSE)
macro(NAMELIST erg in)
set(os "")
set(srcs ${in})
separate_arguments(srcs)
foreach(is ${srcs})
set(os ${os} ${is})
endforeach(is)
set(${erg} ${os})
endmacro(NAMELIST)
macro(FINDMODULES erg in)
set(os "")
set(srcs ${in})
separate_arguments(srcs)
foreach(is ${srcs})
find_package(Qt5${is} REQUIRED)
set(os ${os} Qt5::${is})
endforeach(is)
set(${erg} ${os})
endmacro(FINDMODULES)
NAMELIST(SRCS ${TARGET_SRCS})
FINDMODULES(QLIBS ${QMODULES})
if(INC_PATH)
NAMELIST(INCS ${INC_PATH})
set(INCLUDES ${INCS})
endif(INC_PATH)
if(TARGET_EXTLIBS)
NAMELIST(EXTRA_LIBS ${EXTRA_LIBS} "${TARGET_EXTLIBS}")
endif(TARGET_EXTLIBS)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
include_directories(${INCLUDES})
if(BUILD_LIB)
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-shared")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "-shared")
add_library(${TARGET_NAME} SHARED ${SRCS})
target_link_libraries(${TARGET_NAME} ${QLIBS} ${EXTRA_LIBS})
set_property(TARGET ${TARGET_NAME} PROPERTY VERSION "1.0.0")
set_property(TARGET ${TARGET_NAME} PROPERTY SOVERSION 1 )
install(TARGETS ${TARGET_NAME} LIBRARY DESTINATION lib)
install(TARGETS ${TARGET_NAME} LIBRARY DESTINATION lib NAMELINK_ONLY)
else()
if(USE_LIB_PATH)
add_executable(${TARGET_NAME} ${SRCS})
target_link_libraries(${TARGET_NAME} -L${OUT_PATH}/lib lib${USE_LIB}.so.1
${QLIBS} ${EXTRA_LIBS})
else()
add_executable(${TARGET_NAME} ${SRCS})
target_link_libraries(${TARGET_NAME} ${QLIBS} ${EXTRA_LIBS})
endif(USE_LIB_PATH)
install(TARGETS ${TARGET_NAME} RUNTIME DESTINATION bin)
endif(BUILD_LIB)
共享库由以下内容构建:
cmake -G "Unix Makefiles" -DINC_PATH:STRING="some includes" -DTARGET_EXTLIBS:STRING="sys libs" -DTARGET_NAME:STRING=LibName -DBUILD_LIB:BOOL=1 -DTARGET_SRCS:STRING="cpp- and c-file" -DQMODULES:STRING="Core Gui Widgets PrintSupport" -DOUT_PATH:STRING=InstallPath .. -DCMAKE_INSTALL_PREFIX=InstallPath >> /dev/null
当我尝试针对此共享库构建程序时,使用:
cmake -G "Unix Makefiles" -DINC_PATH:STRING="some includes" -DTARGET_EXTLIBS:STRING="sys libs" -DTARGET_NAME:STRING=ProgName -DBUILD_LIB:BOOL=0 -DTARGET_SRCS:STRING="cpp-file" -DQMODULES:STRING="Core Gui Widgets PrintSupport" -DOUT_PATH=InstallPath -DUSE_LIB:STRING="LibName" -DUSE_LIB_PATH:STRING="BuildPath of LibName" .. -DCMAKE_INSTALL_PREFIX=InstallPath >> /dev/null
我得到错误'lib/libhrlLib.so:未定义对…'的引用'。
当使用qmake构建库时,我没有收到此错误
如何修复此问题?您是否已使用nm实用程序验证库中是否包含该符号?我已验证该符号以及其他许多符号。例如我自己的Widget.enderArea->nm-D../../../lib/libhrlLib.so.1.0.0 | grep'RenderArea'->。。。0000000000028d12 T_ZN10渲染器EA13按键事件EP9QKEYEVENT 0000000000028cd2 T_ZN10渲染器EA14鼠标移动事件0000000000028e9e T_ZN10渲染器EA15按键释放事件EP9QKEYEVENT 0000000000028556 T_ZN10渲染器EA15按键事件EP11QMOUSE事件0000000000027c3a T_ZN10渲染器EAP17QWidget 0000000000027c3a T_ZN10RenderAreaC2EP7QWidget U_ZTv10RenderareA和来自生成的错误:。。。对“渲染区域vtable”的未定义引用