不能link到子弹物理库 - LNK2019,LNK2001
Can't link to bullet physics library - LNK2019,LNK2001
我已经使用 cmake 在 Windows 上构建了 bullet3-3.08(命令已从 bullet3-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 构建我的应用程序。当我 link 到 Bullet 时,我得到很多 linker 错误(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": ""
}
]
}
怎么了?
由于 Bullet 提供了一个 BulletConfig.cmake
文件,因此 link 针对 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})
这应该是 link 到 Bullet 的必要步骤。
我已经使用 cmake 在 Windows 上构建了 bullet3-3.08(命令已从 bullet3-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 构建我的应用程序。当我 link 到 Bullet 时,我得到很多 linker 错误(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": ""
}
]
}
怎么了?
由于 Bullet 提供了一个 BulletConfig.cmake
文件,因此 link 针对 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})
这应该是 link 到 Bullet 的必要步骤。