неопределенная ошибка ссылки при включении пакетов ompl и assimp с помощью CMake
Я получаю следующую ошибку при попытке скомпилировать проект с помощью 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})
Когда я удаляюompl REQUIRED
строку из find_package, код компилируется без проблем. Однако мне также нужно использовать пакет ompl для моего проекта. Я предполагаю, что это как-то связано с использованием ompl самого пакета assimp. Хотя код не компилируется только при включении ompl и исключении assimp из find_package. Какие изменения мне нужно внести в файл CMakeLists.txt, чтобы иметь возможность использовать ompl и assimp?
Спасибо за ваши ответы.
1 ответ
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)