使用 CMake 包含 ompl 和 assimp 包时出现未定义的引用错误

问题描述 投票:0回答:1

尝试使用 CMake 编译我的项目时出现以下错误 (我在 Ubuntu 22.04.2 LTS 上):

Consolidate compiler generated dependencies of target AssimpTest
[ 50%] Building CXX object CMakeFiles/AssimpTest.dir/testArea/AssimpTest.cpp.o
[100%] Linking CXX executable AssimpTest
/usr/bin/ld: CMakeFiles/AssimpTest.dir/testArea/AssimpTest.cpp.o: in function `main':
AssimpTest.cpp:(.text+0x24): undefined reference to `Assimp::Importer::Importer()'
/usr/bin/ld: AssimpTest.cpp:(.text+0x3f): undefined reference to `Assimp::Importer::ReadFile(char const*, unsigned int)'
/usr/bin/ld: AssimpTest.cpp:(.text+0x94): undefined reference to `Assimp::Importer::~Importer()'
/usr/bin/ld: AssimpTest.cpp:(.text+0xba): undefined reference to `Assimp::Importer::~Importer()'
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/AssimpTest.dir/build.make:97: AssimpTest] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/AssimpTest.dir/all] Error 2
gmake: *** [Makefile:91: all] Error 2

这是我要编译的代码:

#include <assimp/Importer.hpp>
#include <assimp/scene.h>
#include <assimp/postprocess.h>
#include <iostream>

int main()
{
    Assimp::Importer importer;

    const aiScene* scene = importer.ReadFile("multiplate-f1-clutch_assemble.dae",
    aiProcess_Triangulate | aiProcess_FlipUVs);

    if (nullptr != scene)
    {
        // handle error
        std::cout << "ERROR: model could not be loaded.";
        return 1;
    }

    // use the loaded model data here
    std::cout << "model successfully loaded \n";

    return 0;
}

我的 CMakeLists.txt 看起来像这样:

cmake_minimum_required(VERSION 3.10)
project(Project_Name)

find_package(
    ompl REQUIRED
    assimp REQUIRED
)

include_directories(
    ${EIGEN_INCLUDE_DIR}
    ${OMPL_INCLUDE_DIRS}
    ${ASSIMP_INLCUDE_DIR}
)

add_executable(AssimpTest testArea/AssimpTest.cpp)
target_link_libraries(AssimpTest ${ASSIMP_LIBRARIES})

当我从 find_package 中删除

ompl REQUIRED
行时,代码编译没有问题。但是,我的项目也需要使用 ompl 包。我猜这与使用 assimp 包本身的 ompl 有关。虽然代码在仅包含 ompl 并从 find_package 中排除 assimp 时无法编译。我需要在我的 CMakeLists.txt 中进行哪些更改才能同时使用 ompl 和 assimp ?

谢谢你的回答。

c++ cmake assimp ompl
1个回答
0
投票
find_package(
    ompl REQUIRED
    assimp REQUIRED 
) 

我不相信你可以在一次调用 find_package() 时列出这两个包我从未见过,而且从我阅读文档我不相信它得到支持。

find_package(<PackageName> [version] [EXACT] [QUIET]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [CONFIG|NO_MODULE]
             [GLOBAL]
             [NO_POLICY_SCOPE]
             [BYPASS_PROVIDER]
             [NAMES name1 [name2 ...]]
             [CONFIGS config1 [config2 ...]]
             [HINTS path1 [path2 ... ]]
             [PATHS path1 [path2 ... ]]
             [REGISTRY_VIEW  (64|32|64_32|32_64|HOST|TARGET|BOTH)]
             [PATH_SUFFIXES suffix1 [suffix2 ...]]
             [NO_DEFAULT_PATH]
             [NO_PACKAGE_ROOT_PATH]
             [NO_CMAKE_PATH]
             [NO_CMAKE_ENVIRONMENT_PATH]
             [NO_SYSTEM_ENVIRONMENT_PATH]
             [NO_CMAKE_PACKAGE_REGISTRY]
             [NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.
             [NO_CMAKE_SYSTEM_PATH]
             [NO_CMAKE_INSTALL_PREFIX]
             [NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
             [CMAKE_FIND_ROOT_PATH_BOTH |
              ONLY_CMAKE_FIND_ROOT_PATH |
              NO_CMAKE_FIND_ROOT_PATH])

从上面我看不出允许在参数中出现超过 1 次。因此,我认为您的问题是

${ASSIMP_LIBRARIES}
是一个空变量,导致没有任何东西可以链接到 assimp。

相反,你应该有两条单独的线:

find_package(ompl REQUIRED)
find_package(assimp REQUIRED)
© www.soinside.com 2019 - 2024. All rights reserved.