CMake单独模块无法指定可执行文件到输出路径——设置可执行程序生成路径不生效

一、背景

我们需要在项目中构建一个测试模块,但是生成的可执行程序,并没有输出到我们想要的项目out目录中,而生成一个单独的命令,试了很多CMAKE的宏都没生效,结果发现是一个project引发的血案…

二、目录结构

在这里插入图片描述
其中SonProject是我们添加的模块:其中的CMakeLists是这样写的:

#设置cmake的最低版本
cmake_minimum_required(VERSION 3.10)
# 设置工程的名称
project(myproject)
#将源代码添加到工程
add_executable(myproject main.cpp)

结果生成的可执行文件并不在我们想要的x64-debug中:
使用:set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/${IDE_BIN_DIR})也没有生效。

三、破案

去掉CmakeLists中的project(myproject)加: set(EXECUTABLE_OUTPUT_PATH${CMAKE_BINARY_DIR}/${IDE_BIN_DIR})

#设置cmake的最低版本
cmake_minimum_required(VERSION 3.10)
#设置可输出路径
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/${IDE_BIN_DIR})
#将源代码添加到工程
add_executable(myproject main.cpp)

四:关于Project关键字

Project参考链接

五、知识扩充

CMake 中的 add_subdirectory 命令可以让你将一个子目录作为另一个 project的一部分来构建。这意味着,如果你在使用 add_subdirectory 命令时,将库生成到子目录而不是 x64-Debug 目录,那么这个库的构建目录将会是所有在父目录中的项目构建目录下的一个子目录。

例如,假设你有一个包含两个子目录的项目,分别为 libapp,然后你在主目录中使用了以下命令:

add_subdirectory(lib)
add_subdirectory(app)

假设 lib 子目录中有一个名为 mylib 的库,而在 lib/CMakeLists.txt 文件中,你定义了一个名为 mylib 的目标,如下所示:

add_library(mylib SHARED mylib.cpp)

然后你再次在 app/CMakeLists.txt 文件中使用了以下命令:

target_link_libraries(myapp mylib)

在这个例子中,当你运行 CMake并构建 app 应用程序时,生成的 myapp 可执行文件将会被构建到 app/build 目录中。而 mylib 库将会被构建到 lib/build 目录下的子目录中。这是因为 CMake 会在父目录的构建目录下为每个子目录创建一个新的构建目录。

值得注意的是,无论在何处指定生成的库文件的位置,最终都是由 CMake 和编译器来确定生成的库文件的位置。在多个目标之间可能有一些差异。例如,生成的库文件的实际位置可能取决于您在将目标链接到库时的命令行参数。

CMake中,默认情况下,每个子目录都会创建一个新的构建目录。如果你不想让 CMake 在父目录的构建目录下为每个子目录创建一个新的构建目录,你可以在父目录的 CMakeLists.txt 文件中设置 CMAKE_SKIP_BUILD_RPATH 变量为 TRUE

以下是一个简单的示例:

# CMakeLists.txt in top-level directory

cmake_minimum_required(VERSION 3.0)

project(MyProject)

# Set CMAKE_SKIP_BUILD_RPATH to TRUE
set(CMAKE_SKIP_BUILD_RPATH TRUE)

# Add subdirectories
add_subdirectory(MyLibrary)
add_subdirectory(MyExecutable)

在这个示例中,我们在顶层 CMakeLists.txt 文件中设置了 CMAKE_SKIP_BUILD_RPATH 变量为 TRUE,这将阻止 CMake 在父目录的构建目录下为每个子目录创建一个新的构建目录。

请注意,如果你使用了外部构建目录,那么 CMAKE_SKIP_BUILD_RPATH 变量将不起作用。在这种情况下,你需要手动为每个子目录创建一个新的构建目录,并在构建时指定正确的路径。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
CMake,你可以使用`CMAKE_RUNTIME_OUTPUT_DIRECTORY`来指定可执行文件生成目录。在主CMakeLists.txt文件,你可以添加以下代码来设置可执行文件目录: ``` set(CMAKE_RUNTIME_OUTPUT_DIRECTORY <目录路径>) ``` 其,`<目录路径>`是你想要指定可执行文件生成目录的路径。\[3\]通过设置`CMAKE_RUNTIME_OUTPUT_DIRECTORY`,你可以将生成可执行文件放置在指定的目录。 #### 引用[.reference_title] - *1* [cmake 生成可执行程序exe并指定安装目录](https://blog.csdn.net/qq_24423085/article/details/100554072)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [cmake设定可执行文件输出目录](https://blog.csdn.net/ly890700/article/details/72808345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [cmake(11):将可执行和库文件分别输出指定目录](https://blog.csdn.net/rangfei/article/details/121909285)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿天堂没有C++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值