问题遇到的现象和发生背景
如题,我使用的软件包叫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。原软件包头文件定义见下图:
想要达到的结果
如果有朋友主要使用clion写代码,并且可以成功让metis在clion中运行,请不吝指教!谢谢!