CMake同时引入OMPL与Assimp包出现未定义引用错误求解决
问题分析与解决方案
出现链接错误的核心原因是OMPL内部依赖Assimp,同时手动调用find_package(assimp)会导致CMake变量冲突,OMPL可能覆盖了Assimp的库路径或版本信息,使得链接时找不到正确的符号。
修正后的CMakeLists.txt(推荐现代CMake写法)
cmake_minimum_required(VERSION 3.10) project(Project_Name) # 先查找OMPL,它会自动处理自身的Assimp依赖 find_package(ompl REQUIRED) # 使用CONFIG模式优先查找Assimp,避免与OMPL的内部依赖产生冲突 find_package(assimp REQUIRED CONFIG) # 添加可执行文件 add_executable(AssimpTest testArea/AssimpTest.cpp) # 链接OMPL和Assimp的命名目标(现代CMake推荐方式,自动传递包含目录和库) target_link_libraries(AssimpTest PRIVATE ompl::ompl assimp::assimp )
关键修改点说明
- 拼写错误修正:原文件中
${ASSIMP_INLCUDE_DIR}存在拼写错误,改为正确的${ASSIMP_INCLUDE_DIR},但使用现代CMake目标后无需手动指定包含目录,目标会自动传递。 - 使用命名目标链接:放弃旧的
${ASSIMP_LIBRARIES}、${OMPL_LIBRARIES}变量,改用OMPL和Assimp导出的命名目标ompl::ompl、assimp::assimp,避免变量冲突问题。 - 调整查找顺序:先查找OMPL让其处理自身依赖,再查找Assimp的CONFIG版本,确保获取系统中正确的Assimp库信息。
备选方案(兼容旧版CMake写法)
如果必须使用变量方式,可显式指定Assimp的查找模式:
cmake_minimum_required(VERSION 3.10) project(Project_Name) find_package(ompl REQUIRED) # 使用NO_MODULE模式查找Assimp,避免OMPL的CONFIG设置干扰 find_package(assimp REQUIRED NO_MODULE) include_directories( ${OMPL_INCLUDE_DIRS} ${ASSIMP_INCLUDE_DIR} ) add_executable(AssimpTest testArea/AssimpTest.cpp) target_link_libraries(AssimpTest ${OMPL_LIBRARIES} ${ASSIMP_LIBRARIES} )
额外代码逻辑修正
你的测试代码中存在逻辑错误:判断模型加载失败的条件写反了,正确写法应为:
if (nullptr == scene) { std::cout << "ERROR: model could not be loaded."; return 1; }
内容的提问来源于stack exchange,提问作者Flair
相关产品推荐
相关产品推荐

