Cmake vcpkg 和子弹
Cmake vcpkg and Bullet
我在这里很迷茫,真的需要一些帮助。
我正在为明年的荣誉项目工作,其中涉及使用 Bullet 和 Vulkan 进行渲染的物理模拟。经过几个月的工作,我的大部分项目都在运行。它需要大量的重构和清理,这将是下一阶段。
我一直在使用 makefile,但出于某些原因希望迁移到 CMake。主要是因为它似乎是标准的,并且因为我想在将来为不同的 OS 编译(我是 运行 Linux 但可能需要部署在 Windows 或 Mac)。最后,我正在重新编译整个项目,即使是一个小改动,随着我开始更多的单元测试,这开始成为一个问题。
旧的makefile如下:
ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
OWN_INCLUDES = \
-I$(ROOT_DIR)/src/Domain \
-I$(ROOT_DIR)/src/Vk \
-I$(ROOT_DIR)/src/Ui \
-I$(ROOT_DIR)/src/Service
ADD_INCLUDES = \
-I/opt/bullet3-master/src \
-I/opt/vk_mem_alloc \
-I/opt/stb_image \
-I/opt/tiny_obj_loader/ \
-I/opt/imgui-vulkan/
BULLET_INCLUDE_PATHS_LIBS = -L/opt/bullet3-master/src/BulletCollision/ \
-L/opt/bullet3-master/src/BulletDynamics/ \
-L/opt/bullet3-master/src/LinearMath/ \
-lBulletDynamics -lBulletCollision -lLinearMath
VULKAN_SDK_PATH = /opt/Vulkan_SDK/1.2.162.1/x86_64
CFLAGS = -std=c++17 -I$(VULKAN_SDK_PATH)/include $(OWN_INCLUDES) $(ADD_INCLUDES)
LDFLAGS = -L$(VULKAN_SDK_PATH)/lib `pkg-config --static --libs glfw3` -lvulkan $(BULLET_INCLUDE_PATHS_LIBS)
IMGUI_CPP_PATHS = /opt/imgui-vulkan/*.cpp
OWN_CPP_PATHS = src/*.cpp src/Domain/*.cpp src/Vk/*.cpp src/Ui/*.cpp src/Service/*.cpp
###### Unit Testing Paths
UNIT_TEST_INCLUDE = -I/opt/catch-header/
UNIT_TESTS_PATH = $(ROOT_DIR)/unit_tests/*.cpp
VulkanRun: $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS)
g++ $(CFLAGS) -o VulkanRun $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS) $(LDFLAGS)
Unit_Test: $(UNIT_TESTS_PATH) src/Domain/*.cpp src/Vk/*.cpp src/Ui/*.cpp src/Service/*.cpp $(IMGUI_CPP_PATHS)
g++ $(UNIT_TEST_INCLUDE) $(CFLAGS) -o Unit_Test $(UNIT_TESTS_PATH) src/Domain/*.cpp src/Vk/*.cpp src/Ui/*.cpp src/Service/*.cpp $(IMGUI_CPP_PATHS) $(LDFLAGS)
VulkanDebug: $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS)
g++ $(CFLAGS) -g -o VulkanDebug $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS) $(LDFLAGS)
VulkanOpt: $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS)
g++ $(CFLAGS) -O3 -o VulkanOpt $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS) $(LDFLAGS)
.PHONY: test clean
run: VulkanRun
LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib
VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/vulkan/explicit_layer.d
./VulkanRun
test: Unit_Test
LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib
VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/vulkan/explicit_layer.d
./Unit_Test
debug: VulkanDebug
LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib
VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/vulkan/explicit_layer.d
optimise: VulkanOpt
LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib
VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/vulkan/explicit_layer.d
./VulkanOpt
7 clean:
rm -f VulkanRun
rm -f Unit_Test
rm -f VulkanDebug
rm -f VulkanOpt
我使用 3.21.0 的最新安装脚本安装了 cmake。
我在项目根目录下创建了一个CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.21.0)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
project(LanderSim)
file(GLOB_RECURSE SOURCES "src/**.cpp")
add_executable(main ${SOURCES})
find_package(Bullet CONFIG REQUIRED)
if (BULLET_FOUND)
include_directories(${BULLET_INCLUDE_DIRS})
target_link_libraries(main PRIVATE LinearMath Bullet3Common BulletDynamics BulletSoftBody)
endif (BULLET_FOUND)
经过几个小时的尝试,我决定试试 vcpkg。按照 bullet 中的安装说明进行操作:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install bullet3
这导致了
的错误
CMake Error at CMakeLists.txt:11 (find_package):
Could not find a package configuration file provided by "Bullet" with any
of the following names: BulletConfig.cmake bullet-config.cmake
查看 CMakeCache.txt 我看到“Bullet_DIR:PATH=Bullet_DIR-NOTFOUND”
我在“/home/ash/vcpkg/installed/x64-linux/share/bullet3”和“/home/ash/vcpkg/packages/bullet3_x64-linux/share/bullet3”中找到了 BulletConfig.make 文件,并将 MakeCache.txt var Bullet_DIR:PATH 设置为这些变量(已测试一次一个)。
运行 再次出现无法识别 CMake set_and_check() 函数。或者类似的东西。查看 BulletConfig.make 文件,我发现 linter 无法识别这些 set_and_check() 函数。我无法在网上找到有关它们被弃用的任何信息,但我认为是这种情况。所以我更改为 set(),然后 CMake 成功并构建了它的文件。
运行 make 然后我得到一个错误。
fatal error: btBulletDynamicsCommon.h: No such file or directory,
#include <btBulletDynamicsCommon.h>
我尝试将 bullet/ 添加到包含路径之前,因为其他人遇到了这个问题,但它导致了同样的错误。
所以我一定是做错了什么,我显然不理解 CMake 用来添加包含和 link 库的过程。我敢肯定,鉴于 CMake 的流行,一定有一些显而易见的东西。但是我在几天内花了大约 10 个小时搜索和尝试不同的变体,我开始感到非常沮丧。
我之前已经放弃了 CMake(因此我用 makefile 工作了几个月),但我决心正确地做到这一点。如果有人知道如何让 CMake 生成可以看到使用 vcpkg 安装的包的 makefile,我真的可以使用一些帮助。
或者确实,如果 Bullet 的 vcpkg 已过时,那么 link 并单独将其包含在 CMake 中的方法会很棒。我只是认为 vcpkg 会更容易,因为它默认提供更清晰的文件结构以及 CMake 配置文件。
谢谢。
编辑1
我已经使用 'cmake .' 和 'cmake . -DCMAKE_TOOLCHAIN_FILE=/home/ash/vcpkg/scripts/buildsystems/vcpkg.cmake' 构建了 makefile。调用 make.
时,两者都会导致相同的缺失 headers 错误
编辑2
在每次调用 cmake 之前,所有 CMake 文件都从项目中删除(CMakeLists.txt 除外),以确保没有值存储在那里。
编辑3
又查了一下。这是 BulletConfig.cmake 文件:
#
# BulletConfig.cmake(.in)
#
# Use the following variables to compile and link against Bullet:
# BULLET_FOUND - True if Bullet was found on your system
# BULLET_USE_FILE - The file making Bullet usable
# BULLET_DEFINITIONS - Definitions needed to build with Bullet
# BULLET_INCLUDE_DIR - Directory where Bullet-C-Api.h can be found
# BULLET_INCLUDE_DIRS - List of directories of Bullet and it's dependencies
# BULLET_LIBRARIES - List of libraries to link against Bullet library
# BULLET_LIBRARY_DIRS - List of directories containing Bullet' libraries
# BULLET_ROOT_DIR - The base directory of Bullet
# BULLET_VERSION_STRING - A human-readable string containing the version
set(PACKAGE_PREFIX_DIR /home/ash/installed/x64-linux)
set ( BULLET_FOUND 1 )
set ( BULLET_USE_FILE "${PACKAGE_PREFIX_DIR}/share/bullet3/UseBullet.cmake" )
set ( BULLET_DEFINITIONS "" )
set ( BULLET_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include/bullet" )
set ( BULLET_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include/bullet" )
set ( BULLET_LIBRARIES "LinearMath;Bullet3Common;BulletInverseDynamics;BulletCollision;BulletDynamics;BulletSoftBody" )
set ( BULLET_LIBRARY_DIRS "${PACKAGE_PREFIX_DIR}/lib" )
set ( BULLET_ROOT_DIR "${PACKAGE_PREFIX_DIR}" )
set ( BULLET_VERSION_STRING "3.17" )
# Load targets
if(NOT TARGET Bullet3Common)
file(GLOB CONFIG_FILES "${PACKAGE_PREFIX_DIR}/share/bullet3/*Targets.cmake")
foreach(f ${CONFIG_FILES})
include(${f})
endforeach()
set(_DIR)
endif()
如前所述,一些集合函数是 set_and_check()。所以我改为 set() 显然 cmake 3.21 没有 set_and_check() 函数。通过打印 message() 进行一些测试后,我发现 PACKAGE_PREFIX_DIR 没有在任何地方设置。所以这就是我在这个文件中明确设置它的原因。 CMakeLists.txt 文件中的 message() 所报告的变量现在已正确设置。但它仍然找不到 header 文件。
编辑4
我创建了一个空项目,运行 遍历了我想要包含的每个库。除 Bullet3 外,一切正常。但是它现在确实看到了 header 文件。两个 CMakeFile 之间发生了什么变化?据我所知,没有什么。我需要找出答案,因为我必须将这个项目移植过来,但与此同时,这是软件包的另一个问题。
from /home/ash/projects/C++/CMakeImportTests/src/main.cpp:22:
/home/ash/vcpkg/installed/x64-linux/include/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h:77:10:
fatal error: LinearMath/btVector3.h: No such file or directory
77 | #include "LinearMath/btVector3.h"
我认为这与 #7877 中描述的问题相同
如果我删除 Bullet 的所有包含但保持 CMakeList.txt 不变,我们会收到此错误:
[ 50%] Building CXX object CMakeFiles/main.dir/src/main.cpp.o
[100%] Linking CXX executable main
/usr/bin/ld: cannot find -lLinearMath
/usr/bin/ld: cannot find -lBullet3Common
/usr/bin/ld: cannot find -lBulletDynamics
/usr/bin/ld: cannot find -lBulletSoftBody
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/main.dir/build.make:104: main] Error 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
这是没有设置某些环境变量的线索吗?
编辑5
target_link_library 调用似乎存在顺序依赖性。建议的用法是:
target_link_libraries(main PRIVATE LinearMath Bullet3Common BulletDynamics BulletSoftBody)
在我找到的 libs/ 目录中检查 bullet.pc
Libs: -L${libdir} -lBulletSoftBody -lBulletDynamics -lBulletCollision -lLinearMath
所以我尝试了 rear运行ging 并遵循以下模式:
target_link_libraries(main PRIVATE BulletSoftBody BulletDynamics BulletCollision Bullet3Common LinearMath)
此外还需要手动 link 目录。
target_link_directories(main PRIVATE ${BULLET_LIBRARY_DIRS})
现在在我的测试项目中编译没有错误。似乎 LinearMath 必须在大多数其他库之后(尽管它似乎可以在 Bullet3Common 之前)。
出于某种原因,当我将完全相同的 CMake 命令复制到我的主项目时,它仍然找不到 header 文件。所以我还没有摆脱这个。
我应该说我能够删除我对集合的 BulletConfig.cmake 所做的更改ing PACKAGE_PREFIX_DIR 静态。
所以只是回顾一下我的问题。一个小的测试项目有效,我可以使用项目符号和我在主项目中使用的其他库的数量。但是,如果我将此工作 CMakeLists.txt 复制到我的主项目中,它就无法再找到 header 并抛出此错误:
btBulletDynamicsCommon.h: No such file or directory
8 | #include <btBulletDynamicsCommon.h>
Bullet_DIR:PATH=/home/ash/vcpkg/installed/x64-linux/share/bullet3 在这两种情况下是相同的。
毕竟。
set_and_include() 错误是一个已知问题,vcpkg git 的 mathisloge 表示需要更新 Bullet 包。解决方法是更改对 set() 的调用。
目标库的顺序很重要。 Bullet vcpkg 包中的建议方式是:
target_link_libraries(main PRIVATE LinearMath Bullet3Common BulletDynamics BulletSoftBody)
但是编译失败。应该是:
target_link_libraries(main PRIVATE BulletSoftBody BulletDynamics BulletCollision Bullet3Common LinearMath)
还必须使用 :
告诉 cmake link 目录
target_link_directories(main PRIVATE ${BULLET_LIBRARY_DIRS})
然后我仍然 header 遗漏错误。但是在重新启动之后,事情又开始了。希望这里有足够的帮助遇到类似问题的人。
我在这里很迷茫,真的需要一些帮助。
我正在为明年的荣誉项目工作,其中涉及使用 Bullet 和 Vulkan 进行渲染的物理模拟。经过几个月的工作,我的大部分项目都在运行。它需要大量的重构和清理,这将是下一阶段。
我一直在使用 makefile,但出于某些原因希望迁移到 CMake。主要是因为它似乎是标准的,并且因为我想在将来为不同的 OS 编译(我是 运行 Linux 但可能需要部署在 Windows 或 Mac)。最后,我正在重新编译整个项目,即使是一个小改动,随着我开始更多的单元测试,这开始成为一个问题。
旧的makefile如下:
ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
OWN_INCLUDES = \
-I$(ROOT_DIR)/src/Domain \
-I$(ROOT_DIR)/src/Vk \
-I$(ROOT_DIR)/src/Ui \
-I$(ROOT_DIR)/src/Service
ADD_INCLUDES = \
-I/opt/bullet3-master/src \
-I/opt/vk_mem_alloc \
-I/opt/stb_image \
-I/opt/tiny_obj_loader/ \
-I/opt/imgui-vulkan/
BULLET_INCLUDE_PATHS_LIBS = -L/opt/bullet3-master/src/BulletCollision/ \
-L/opt/bullet3-master/src/BulletDynamics/ \
-L/opt/bullet3-master/src/LinearMath/ \
-lBulletDynamics -lBulletCollision -lLinearMath
VULKAN_SDK_PATH = /opt/Vulkan_SDK/1.2.162.1/x86_64
CFLAGS = -std=c++17 -I$(VULKAN_SDK_PATH)/include $(OWN_INCLUDES) $(ADD_INCLUDES)
LDFLAGS = -L$(VULKAN_SDK_PATH)/lib `pkg-config --static --libs glfw3` -lvulkan $(BULLET_INCLUDE_PATHS_LIBS)
IMGUI_CPP_PATHS = /opt/imgui-vulkan/*.cpp
OWN_CPP_PATHS = src/*.cpp src/Domain/*.cpp src/Vk/*.cpp src/Ui/*.cpp src/Service/*.cpp
###### Unit Testing Paths
UNIT_TEST_INCLUDE = -I/opt/catch-header/
UNIT_TESTS_PATH = $(ROOT_DIR)/unit_tests/*.cpp
VulkanRun: $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS)
g++ $(CFLAGS) -o VulkanRun $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS) $(LDFLAGS)
Unit_Test: $(UNIT_TESTS_PATH) src/Domain/*.cpp src/Vk/*.cpp src/Ui/*.cpp src/Service/*.cpp $(IMGUI_CPP_PATHS)
g++ $(UNIT_TEST_INCLUDE) $(CFLAGS) -o Unit_Test $(UNIT_TESTS_PATH) src/Domain/*.cpp src/Vk/*.cpp src/Ui/*.cpp src/Service/*.cpp $(IMGUI_CPP_PATHS) $(LDFLAGS)
VulkanDebug: $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS)
g++ $(CFLAGS) -g -o VulkanDebug $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS) $(LDFLAGS)
VulkanOpt: $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS)
g++ $(CFLAGS) -O3 -o VulkanOpt $(OWN_CPP_PATHS) $(IMGUI_CPP_PATHS) $(LDFLAGS)
.PHONY: test clean
run: VulkanRun
LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib
VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/vulkan/explicit_layer.d
./VulkanRun
test: Unit_Test
LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib
VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/vulkan/explicit_layer.d
./Unit_Test
debug: VulkanDebug
LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib
VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/vulkan/explicit_layer.d
optimise: VulkanOpt
LD_LIBRARY_PATH=$(VULKAN_SDK_PATH)/lib
VK_LAYER_PATH=$(VULKAN_SDK_PATH)/etc/vulkan/explicit_layer.d
./VulkanOpt
7 clean:
rm -f VulkanRun
rm -f Unit_Test
rm -f VulkanDebug
rm -f VulkanOpt
我使用 3.21.0 的最新安装脚本安装了 cmake。
我在项目根目录下创建了一个CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.21.0)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
project(LanderSim)
file(GLOB_RECURSE SOURCES "src/**.cpp")
add_executable(main ${SOURCES})
find_package(Bullet CONFIG REQUIRED)
if (BULLET_FOUND)
include_directories(${BULLET_INCLUDE_DIRS})
target_link_libraries(main PRIVATE LinearMath Bullet3Common BulletDynamics BulletSoftBody)
endif (BULLET_FOUND)
经过几个小时的尝试,我决定试试 vcpkg。按照 bullet 中的安装说明进行操作:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install bullet3
这导致了
的错误CMake Error at CMakeLists.txt:11 (find_package): Could not find a package configuration file provided by "Bullet" with any of the following names: BulletConfig.cmake bullet-config.cmake
查看 CMakeCache.txt 我看到“Bullet_DIR:PATH=Bullet_DIR-NOTFOUND”
我在“/home/ash/vcpkg/installed/x64-linux/share/bullet3”和“/home/ash/vcpkg/packages/bullet3_x64-linux/share/bullet3”中找到了 BulletConfig.make 文件,并将 MakeCache.txt var Bullet_DIR:PATH 设置为这些变量(已测试一次一个)。
运行 再次出现无法识别 CMake set_and_check() 函数。或者类似的东西。查看 BulletConfig.make 文件,我发现 linter 无法识别这些 set_and_check() 函数。我无法在网上找到有关它们被弃用的任何信息,但我认为是这种情况。所以我更改为 set(),然后 CMake 成功并构建了它的文件。
运行 make 然后我得到一个错误。
fatal error: btBulletDynamicsCommon.h: No such file or directory, #include <btBulletDynamicsCommon.h>
我尝试将 bullet/ 添加到包含路径之前,因为其他人遇到了这个问题,但它导致了同样的错误。
所以我一定是做错了什么,我显然不理解 CMake 用来添加包含和 link 库的过程。我敢肯定,鉴于 CMake 的流行,一定有一些显而易见的东西。但是我在几天内花了大约 10 个小时搜索和尝试不同的变体,我开始感到非常沮丧。
我之前已经放弃了 CMake(因此我用 makefile 工作了几个月),但我决心正确地做到这一点。如果有人知道如何让 CMake 生成可以看到使用 vcpkg 安装的包的 makefile,我真的可以使用一些帮助。
或者确实,如果 Bullet 的 vcpkg 已过时,那么 link 并单独将其包含在 CMake 中的方法会很棒。我只是认为 vcpkg 会更容易,因为它默认提供更清晰的文件结构以及 CMake 配置文件。
谢谢。
编辑1
我已经使用 'cmake .' 和 'cmake . -DCMAKE_TOOLCHAIN_FILE=/home/ash/vcpkg/scripts/buildsystems/vcpkg.cmake' 构建了 makefile。调用 make.
时,两者都会导致相同的缺失 headers 错误编辑2
在每次调用 cmake 之前,所有 CMake 文件都从项目中删除(CMakeLists.txt 除外),以确保没有值存储在那里。
编辑3
又查了一下。这是 BulletConfig.cmake 文件:
#
# BulletConfig.cmake(.in)
#
# Use the following variables to compile and link against Bullet:
# BULLET_FOUND - True if Bullet was found on your system
# BULLET_USE_FILE - The file making Bullet usable
# BULLET_DEFINITIONS - Definitions needed to build with Bullet
# BULLET_INCLUDE_DIR - Directory where Bullet-C-Api.h can be found
# BULLET_INCLUDE_DIRS - List of directories of Bullet and it's dependencies
# BULLET_LIBRARIES - List of libraries to link against Bullet library
# BULLET_LIBRARY_DIRS - List of directories containing Bullet' libraries
# BULLET_ROOT_DIR - The base directory of Bullet
# BULLET_VERSION_STRING - A human-readable string containing the version
set(PACKAGE_PREFIX_DIR /home/ash/installed/x64-linux)
set ( BULLET_FOUND 1 )
set ( BULLET_USE_FILE "${PACKAGE_PREFIX_DIR}/share/bullet3/UseBullet.cmake" )
set ( BULLET_DEFINITIONS "" )
set ( BULLET_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include/bullet" )
set ( BULLET_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include/bullet" )
set ( BULLET_LIBRARIES "LinearMath;Bullet3Common;BulletInverseDynamics;BulletCollision;BulletDynamics;BulletSoftBody" )
set ( BULLET_LIBRARY_DIRS "${PACKAGE_PREFIX_DIR}/lib" )
set ( BULLET_ROOT_DIR "${PACKAGE_PREFIX_DIR}" )
set ( BULLET_VERSION_STRING "3.17" )
# Load targets
if(NOT TARGET Bullet3Common)
file(GLOB CONFIG_FILES "${PACKAGE_PREFIX_DIR}/share/bullet3/*Targets.cmake")
foreach(f ${CONFIG_FILES})
include(${f})
endforeach()
set(_DIR)
endif()
如前所述,一些集合函数是 set_and_check()。所以我改为 set() 显然 cmake 3.21 没有 set_and_check() 函数。通过打印 message() 进行一些测试后,我发现 PACKAGE_PREFIX_DIR 没有在任何地方设置。所以这就是我在这个文件中明确设置它的原因。 CMakeLists.txt 文件中的 message() 所报告的变量现在已正确设置。但它仍然找不到 header 文件。
编辑4
我创建了一个空项目,运行 遍历了我想要包含的每个库。除 Bullet3 外,一切正常。但是它现在确实看到了 header 文件。两个 CMakeFile 之间发生了什么变化?据我所知,没有什么。我需要找出答案,因为我必须将这个项目移植过来,但与此同时,这是软件包的另一个问题。
from /home/ash/projects/C++/CMakeImportTests/src/main.cpp:22: /home/ash/vcpkg/installed/x64-linux/include/bullet/BulletCollision/CollisionDispatch/btCollisionWorld.h:77:10:
fatal error: LinearMath/btVector3.h: No such file or directory 77 | #include "LinearMath/btVector3.h"
我认为这与 #7877 中描述的问题相同
如果我删除 Bullet 的所有包含但保持 CMakeList.txt 不变,我们会收到此错误:
[ 50%] Building CXX object CMakeFiles/main.dir/src/main.cpp.o [100%] Linking CXX executable main /usr/bin/ld: cannot find -lLinearMath /usr/bin/ld: cannot find -lBullet3Common /usr/bin/ld: cannot find -lBulletDynamics /usr/bin/ld: cannot find -lBulletSoftBody collect2: error: ld returned 1 exit status make[2]: *** [CMakeFiles/main.dir/build.make:104: main] Error 1 make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/main.dir/all] Error 2 make: *** [Makefile:91: all] Error 2
这是没有设置某些环境变量的线索吗?
编辑5
target_link_library 调用似乎存在顺序依赖性。建议的用法是:
target_link_libraries(main PRIVATE LinearMath Bullet3Common BulletDynamics BulletSoftBody)
在我找到的 libs/ 目录中检查 bullet.pc
Libs: -L${libdir} -lBulletSoftBody -lBulletDynamics -lBulletCollision -lLinearMath
所以我尝试了 rear运行ging 并遵循以下模式:
target_link_libraries(main PRIVATE BulletSoftBody BulletDynamics BulletCollision Bullet3Common LinearMath)
此外还需要手动 link 目录。
target_link_directories(main PRIVATE ${BULLET_LIBRARY_DIRS})
现在在我的测试项目中编译没有错误。似乎 LinearMath 必须在大多数其他库之后(尽管它似乎可以在 Bullet3Common 之前)。
出于某种原因,当我将完全相同的 CMake 命令复制到我的主项目时,它仍然找不到 header 文件。所以我还没有摆脱这个。
我应该说我能够删除我对集合的 BulletConfig.cmake 所做的更改ing PACKAGE_PREFIX_DIR 静态。
所以只是回顾一下我的问题。一个小的测试项目有效,我可以使用项目符号和我在主项目中使用的其他库的数量。但是,如果我将此工作 CMakeLists.txt 复制到我的主项目中,它就无法再找到 header 并抛出此错误:
btBulletDynamicsCommon.h: No such file or directory 8 | #include <btBulletDynamicsCommon.h>
Bullet_DIR:PATH=/home/ash/vcpkg/installed/x64-linux/share/bullet3 在这两种情况下是相同的。
毕竟。
set_and_include() 错误是一个已知问题,vcpkg git 的 mathisloge 表示需要更新 Bullet 包。解决方法是更改对 set() 的调用。
目标库的顺序很重要。 Bullet vcpkg 包中的建议方式是:
target_link_libraries(main PRIVATE LinearMath Bullet3Common BulletDynamics BulletSoftBody)
但是编译失败。应该是:
target_link_libraries(main PRIVATE BulletSoftBody BulletDynamics BulletCollision Bullet3Common LinearMath)
还必须使用 :
告诉 cmake link 目录target_link_directories(main PRIVATE ${BULLET_LIBRARY_DIRS})
然后我仍然 header 遗漏错误。但是在重新启动之后,事情又开始了。希望这里有足够的帮助遇到类似问题的人。