链接CompactNSearch库时遇构造函数未定义引用错误求助
编译CompactNSearch时出现未定义引用错误的解决方法
问题描述
使用CompactNSearch库时,编译阶段出现未解决的链接错误,耗时数小时未修复。
最小可复现示例(MWE)
目录结构
克隆库后的目录结构如下:
├── CMakeLists.txt ├── CompactNSearch ... └── main.cpp
main.cpp代码
#include "CompactNSearch.h" using namespace CompactNSearch; int main() { float r = 0; NeighborhoodSearch nsearch(r); }
CMakeLists.txt代码
cmake_minimum_required(VERSION 3.22) project(MyProject VERSION 1.0 LANGUAGES CXX) add_executable( MyProject main.cpp ) add_subdirectory(CompactNSearch) target_link_libraries(MyProject CompactNSearch)
操作步骤
mkdir build cd build cmake .. make
编译报错信息
[ 16%] Building CXX object CompactNSearch/CMakeFiles/CompactNSearch.dir/src/CompactNSearch.cpp.o [ 33%] Linking CXX static library libCompactNSearch.a [ 33%] Built target CompactNSearch [ 50%] Building CXX object CMakeFiles/MyProject.dir/main.cpp.o [ 66%] Linking CXX executable MyProject /usr/bin/ld: CMakeFiles/MyProject.dir/main.cpp.o: in function `main': main.cpp:(.text+0x44): undefined reference to `CompactNSearch::NeighborhoodSearch::NeighborhoodSearch(float, bool)' collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/MyProject.dir/build.make:100: MyProject] Error 1 make[1]: *** [CMakeFiles/Makefile2:117: CMakeFiles/MyProject.dir/all] Error 2 make: *** [Makefile:136: all] Error 2
已尝试的解决方法
- 尝试多种CMake链接库的写法
- 分别将库编译为静态/共享库后再链接,结果一致
- 在构造函数定义中添加
#error This should be shown,确认该代码已被编译
解决方案
问题根源是CompactNSearch库通过编译flag控制精度类型(float/double),默认启用double精度,与代码中传入float参数的构造函数不匹配。修改CMakeLists.txt,在引入子目录前添加精度控制flag即可解决:
cmake_minimum_required(VERSION 3.22) project(MyProject VERSION 1.0 LANGUAGES CXX) # 强制使用float精度,匹配代码中的参数类型 set(USE_DOUBLE_PRECISION OFF) add_executable( MyProject main.cpp ) add_subdirectory(CompactNSearch) target_link_libraries(MyProject CompactNSearch)
内容的提问来源于stack exchange,提问作者Hakka
相关产品推荐
相关产品推荐

