使用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




