【发布时间】:2017-02-23 01:58:38
【问题描述】:
背景
在 Windows 上,我使用 CMake (3.2.3) 和 Visual Studio 2015(社区)来构建一个名为 Foo 的 C++ 项目。 Foo 由一个名为 foo 的共享库组成。我在调试和发布配置中构建和安装 Foo。我将CMAKE_DEBUG_POSTFIX设置为_d,这样Foo的安装就包含foo.dll和foo_d.dll,以及CMake配置文件FooConfig.cmake、FooTargets.cmake、FooTargets-debug.cmake和FooTargets-release.cmake。
现在,我开始构建一个单独的 CMake 项目 Bar,它由一个可执行的“bar”组成,并且依赖于库 foo。但是我在 RelWithDebInfo 配置中构建了 bar。当我尝试从 Visual Studio 运行 bar 时,它会查找 foo_d.dll 而不是 foo.dll。
也就是说,如果 RelWithDebInfo 配置下不存在依赖项,则 RelWithDebInfo 配置会退回到 Debug 配置。
这是 Foo 的 CMakeLists.txt:
project(Foo)
cmake_minimum_required(VERSION 3.2.3)
add_library(foo SHARED foo.h foo.cpp)
install(TARGETS foo EXPORT FooTargets DESTINATION
RUNTIME DESTINATION bin LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
configure_package_config_file(FooConfig.cmake.in
"${CMAKE_BINARY_DIR}/FooConfigToInstall.cmake"
INSTALL_DESTINATION cmake)
install(FILES ${CMAKE_BINARY_DIR}/FooConfigToInstall.cmake"
DESTINATION cmake RENAME FooConfig.cmake)
install(EXPORT FooTargets DESTINATION cmake)
这是 Bar 的 CMakeLists.txt:
project(Bar)
cmake_minimum_required(VERSION 3.2.3)
find_package(Foo)
add_executable(bar bar.cpp)
target_link_libraries(bar foo)
问题
如果所需的配置对依赖项不可用,CMake 如何确定依赖项依赖哪个配置?
跟进:是否有可能控制这种回退?理想情况下,不会有回退。我希望 CMake 给出一个错误,例如“无法在 RelWithDebInfo 配置中构建栏,因为依赖项 foo 在该配置中不可用(可用配置:调试、发布)。
【问题讨论】:
-
请提供一些代码。目前还不清楚
Foo和Bar项目是如何相关的——一个是包含另一个,还是你独立构建它们。您如何准确地将bar可执行文件与foo库链接起来? -
我分别构建 Foo 和 Bar。我会添加更多细节。
-
我现在在原帖中添加了更多细节。
标签: c++ visual-studio dll cmake