Не могу подключиться к библиотеке физики пуль - LNK2019,LNK2001

Я собрал пулю 3-3.08 в Windows с помощью cmake (команды выполнялись из папки сборки, созданной в каталоге пули 3-3.08):

cmake -G "Visual Studio 15 2017" -A x64 -D "CMAKE_INSTALL_PREFIX:PATH=C:/MyLibs/bullet3-3.08" -D "USE_MSVC_RUNTIME_LIBRARY_DLL=ON" -D "INSTALL_LIBS=ON" ..
cmake --build . --config Release --parallel 8 --target install

У меня есть приложение, которое использует библиотеку времени выполнения MD/MDd, поэтому я собрал Bullet со следующей опцией: USE_MSVC_RUNTIME_LIBRARY_DLL=ON. Bullet по умолчанию построен как статическая библиотека. Я использую Visual Studio 2017 и создаю свое приложение с помощью cmake. Когда я ссылаюсь на Bullet, я получаю много ошибок компоновщика (LNK2019, LNK2001), например:

error LNK2019: unresolved external symbol "public: __cdecl btCollisionDispatcher::btCollisionDispatcher(class btCollisionConfiguration *)" (??0btCollisionDispatcher@@QEAA@PEAVbtCollisionConfiguration@@@Z) referenced in function main
error LNK2001: unresolved external symbol "public: virtual void __cdecl btCollisionShape::getBoundingSphere(class btVector3 &,float &)const " (?getBoundingSphere@btCollisionShape@@UEBAXAEAVbtVector3@@AEAM@Z)

Я использую прямые пути к библиотекам в CMakeLists.txt:

target_link_libraries(${executableName} "C:/MyLibs/bullet3-3.08/lib/Bullet3Collision.lib"
                                        "C:/MyLibs/bullet3-3.08/lib/Bullet3Dynamics.lib"
                                        "C:/MyLibs/bullet3-3.08/lib/LinearMath.lib")

Вот CMakeSettings.json:

{
  "configurations": [
    {
      "name": "x64-Debug",
      "generator": "Ninja",
      "configurationType": "Debug",
      "inheritEnvironments": [
        "msvc_x64_x64"
      ],
      "buildRoot": "${projectDir}\\build\\${name}",
      "installRoot": "${projectDir}\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": ""
    },
    {
      "name": "x64-Release",
      "generator": "Ninja",
      "configurationType": "Release",
      "inheritEnvironments": [
        "msvc_x64_x64"
      ],
      "buildRoot": "${projectDir}\\build\\${name}",
      "installRoot": "${projectDir}\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": ""
    }
  ]
}

Что не так ?


person Irbis    schedule 14.01.2021    source источник


Ответы (1)


Поскольку Bullet предоставляет файл BulletConfig.cmake, его довольно просто связать с Bullet.

Сначала вам нужно установить Bullet (если это не сделано) и добавить -DCMAKE_PREFIX_PATH=C:/MyLibs/bullet3-3.08 (или соответствующий каталог установки) в командную строку cmake.

Затем в вашем файле CMakeLists.txt вам нужно добавить

find_package(Bullet REQUIRED)
# your add_executable call follows here
add_executable(${executableName} .......)
target_compile_definitions(${executableName} PRIVATE ${BULLET_DEFINITIONS})
target_include_directories(${executableName} PRIVATE ${BULLET_INCLUDE_DIRS})
target_link_libraries(${executableName} PRIVATE ${BULLET_LIBRARIES})

Это должны быть шаги, необходимые для ссылки на Bullet.

person vre    schedule 14.01.2021
comment
${BULLET_LIBRARIES} содержит библиотеки, которые необходимо слинковать. Я связал Bullet3Collision.lib вместо BulletCollision.lib - person Irbis; 14.01.2021