You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用CMake定义可执行文件二进制目录后,Conan未将可执行文件复制至指定目录的问题求助

问题分析与解决方案

嘿,我来帮你排查下这个问题!你已经手动用CMake指定了输出目录到/mnt/t/myapp/bin,但集成Conan后可执行文件没按预期跑到指定目录,结合你的配置来看,问题主要出在Conan的conan_basic_setup指令和你现有CMake设置的交互上,具体原因和解决办法如下:

可能的原因

  • 指令顺序搞反了:你先设置了CMAKE_*_OUTPUT_DIRECTORY,再引入Conan的脚本。但conan_basic_setup(TARGETS)会自动重置这些输出目录变量,把它们改成Conan默认的路径(比如构建目录下的bin/lib子文件夹),直接覆盖了你之前的设置。
  • 旧版CMake生成器的特性:你用的是cmake生成器,它生成的conanbuildinfo.cmake里的conan_basic_setup会强行接管输出目录的配置,优先级比你手动设置的高。

解决办法

方法1:调整顺序,让自己的设置覆盖Conan

把输出目录的设置放到conan_basic_setup之后,这样CMake的本地设置会覆盖Conan的默认配置:

INCLUDE(${BUILD_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)
# 现在再设置输出目录,确保生效
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BINARY_DIR})
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BINARY_DIR})
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BINARY_DIR})

方法2:让Conan别碰输出目录

调用conan_basic_setup时加上NO_OUTPUT_DIRS参数,明确告诉Conan不要修改你的输出目录配置:

INCLUDE(${BUILD_DIR}/conanbuildinfo.cmake)
# 加上NO_OUTPUT_DIRS,保留自定义输出目录
conan_basic_setup(TARGETS NO_OUTPUT_DIRS)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BINARY_DIR})
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BINARY_DIR})
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BINARY_DIR})

方法3:改用更友好的Conan生成器(推荐)

你现在用的cmake生成器是比较旧的版本,推荐换成cmake_find_package或者cmake_find_package_multi,它们不会直接修改你的全局CMake变量,而是生成标准的FindXXX.cmake文件,用find_package就能引入依赖,对原有配置的侵入性极小:
先修改conanfile.txt

[requires]
Poco/1.10.1@pocoproject/stable
[generators]
cmake_find_package

然后在CMakeLists.txt里这样写:

INCLUDE(${BUILD_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)
# 用标准方式引入Poco
find_package(Poco REQUIRED)
# 构建你的可执行文件
add_executable(myapp main.cpp)
target_link_libraries(myapp Poco::Poco)
# 输出目录设置可以随便放(前后都没问题,不会被Conan覆盖)
SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BINARY_DIR})
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BINARY_DIR})
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BINARY_DIR})

验证小技巧

修改完配置后,重新跑一遍CMake(比如cmake ..),然后编译。如果还是没生效,可以查看CMake的配置日志,搜索CMAKE_RUNTIME_OUTPUT_DIRECTORY,看看它的最终值是不是你指定的/mnt/t/myapp/bin,这样就能快速定位问题。

内容的提问来源于stack exchange,提问作者montjet

火山引擎 最新活动