我本鼠狂人 2023-01-12 20:11 采纳率: 60%
浏览 138
已结题

clion使用第三方软件包时遇到“undefined reference”错误

问题遇到的现象和发生背景

如题,我使用的软件包叫metis,是用来求图划分的(软件包见提取码:9aun ),之前怀疑是编译器不兼容,重新编译了整个软件包之后调用其中的api时仍然报undefined reference错误,被这个问题折磨了整整一周,太心累了……

完整项目配置信息

我用的开发软件是clion,编译器是mingw,我一开始以为往clion工程文件中引入第三方库也就是改个cmakelist文件的事,结果发现没那么简单,相关配置文件如下:

cmake_minimum_required(VERSION 3.21)
project(PMSLS-clion-version)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexec-charset=UTF-8")

set(INC_DIR D:/METIS/include)   # metis.h所在目录
set(LINK_DIR D:/METIS/bin/libmetis) # libmetis.a所在目录
include_directories(${INC_DIR}) #导入第三方库头文件
link_directories(${LINK_DIR})   #链接第三方库文件

# 其他本项目自定义头文件(相对路径)
include_directories(
        configure_files
        include/MatrixClass
        include/VectorClass
        include/SolverClass
        preconditioner
        solver
)

#测试MSLR预处理
add_executable(test-mslr ./preconditioner/test_mslr.cpp)

#链接项目和第三方库metis
target_link_libraries(PMSLS-clion-version libmetis.a)
运行结果及详细报错内容

于是重运行cmakelist之后没有错误提示,但点击构建项目时就出现了如下报错信息:

====================[ 构建 | test-mslr | Debug ]==================================
"C:\Program Files\JetBrains\CLion 2022.2.4\bin\cmake\win\bin\cmake.exe" --build C:\Users\24987\CLionProjects\PMSLS-clion-version\cmake-build-debug --target test-mslr -j 9
[1/1] Linking CXX executable test-mslr.exe
FAILED: test-mslr.exe 
cmd.exe /C "cd . && C:\PROGRA~1\JETBRA~1\CLION2~1.4\bin\mingw\bin\G__~1.EXE -Wall -fexec-charset=UTF-8 -g  CMakeFiles/test-mslr.dir/preconditioner/test_mslr.cpp.obj -o test-mslr.exe -Wl,--out-implib,libtest-mslr.dll.a -Wl,--major-image-version,0,--minor-image-version,0 -LD:/METIS/bin/libmetis -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
C:\Program Files\JetBrains\CLion 2022.2.4\bin\mingw\bin/ld.exe: CMakeFiles/test-mslr.dir/preconditioner/test_mslr.cpp.obj: in function `int mslr::CsrMatrixMetisKway<double>(mat::CSRMatrix<double>&, unsigned int&, vec::GeneralVector<unsigned int>&, bool, vec::GeneralVector<unsigned int>&, unsigned int&, vec::GeneralVector<unsigned int>&, vec::GeneralVector<unsigned int>&)':
C:/Users/24987/CLionProjects/PMSLS-clion-version/preconditioner/MSLR.cpp:262: undefined reference to `METIS_PartGraphKway'
C:\Program Files\JetBrains\CLion 2022.2.4\bin\mingw\bin/ld.exe: C:/Users/24987/CLionProjects/PMSLS-clion-version/preconditioner/MSLR.cpp:268: undefined reference to `METIS_PartGraphRecursive'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

总的说来,就是编译器认为我没有定义metis软件包中的“METIS_PartGraphKway”函数和“METIS_PartGraphRecursive”函数,但显然,一切都写在了原软件包中,我仅仅只是导入使用而已,调用函数的代码如下:

/* 其他代码略 */
        //官方建议划分子图个数超过8,建议使用METIS_PartGraphKway;小规模划分使用METIS_PartGraphRecursive,这样可以得到更高质量的解
        if (lnum_dom >= 8) {
            METIS_PartGraphKway(&lnrows, &ncon, xadj.getFirstValuePtr(), adjncy.getFirstValuePtr(),
                                vwgt.getFirstValuePtr(), NULL, adjwgt.getFirstValuePtr(), &lnum_dom,
                                NULL, NULL, NULL, &ledgecut, lmap.getFirstValuePtr());
        } else {
            METIS_PartGraphRecursive(&lnrows, &ncon, xadj.getFirstValuePtr(), adjncy.getFirstValuePtr(),
                                     vwgt.getFirstValuePtr(), NULL, adjwgt.getFirstValuePtr(), &lnum_dom,
                                     NULL, NULL, NULL, &ledgecut, lmap.getFirstValuePtr());
        }

着实不理解哪里出了问题,按理说clion的语法检查也没告警,不应该提示我undefined reference。原软件包头文件定义见下图:

img

想要达到的结果

如果有朋友主要使用clion写代码,并且可以成功让metis在clion中运行,请不吝指教!谢谢!

  • 写回答

2条回答 默认 最新

  • TGpenguin 2023-01-12 20:25
    关注

    这个错误提示是因为在构建项目时,链接库文件libmetis.a和项目文件test-mslr.cpp之间没有连接上。可以在add_executable(test-mslr ./preconditioner/test_mslr.cpp)之后添加一行target_link_libraries(test-mslr libmetis.a)来链接库文件和项目文件。或者是你链接错了库,应该是target_link_libraries(test-mslr libmetis.a)。

    修改代码如下:

    cmake_minimum_required(VERSION 3.21)
    project(PMSLS-clion-version)
    
    set(CMAKE_CXX_STANDARD 11)
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fexec-charset=UTF-8")
    
    set(INC_DIR D:/METIS/include)   # metis.h所在目录
    set(LINK_DIR D:/METIS/bin/libmetis) # libmetis.a所在目录
    include_directories(${INC_DIR}) #导入第三方库头文件
    link_directories(${LINK_DIR})   #链接第三方库文件
    
    # 其他本项目自定义头文件(相对路径)
    include_directories(
            configure_files
            include/MatrixClass
            include/VectorClass
            include/SolverClass
            preconditioner
            solver
    )
    
    #测试MSLR预处理
    add_executable(test-mslr ./preconditioner/test_mslr.cpp)
    
    #链接项目和第三方库metis
    target_link_libraries(test-mslr libmetis.a)
    

    这样修改之后,在重新编译项目时应该不会出现“undefined reference”错误了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 已采纳回答 1月13日
  • 创建了问题 1月12日

悬赏问题

  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行