使用 cmake 编译可执行文件

13 篇文章 0 订阅
6 篇文章 0 订阅

如我们写好源代码和主函数,可以不使用 IDE 直接用命令行编译成可执行文件。比如需要提供一个工具程序提供给后端通过命令行调用。可能有的人认为直接编译成可执行文件给别人不就 OK 了吗?

但问题来了,你本地编译的平台和架构可能和别人的不一样,直接给别人编译好的可执行文件可能跑不起来,举个栗子,我本地是 Mac 电脑,我编译好的执行文件在 Mac 电脑上跑没问题,但服务端同学是 Linux 的就跑不起来。

所以我们写好编译脚本把源码给他们,他们基于自己的平台编译就 OK 了。

比如,源码结构如下:

├── source
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── main.cpp
│   └── utils
│       ├── STAudioUtils.cpp
│       ├── STAudioUtils.h
│       ├── WaveFile.cpp
│       └── WaveFile.h

编译脚本,CMakeLists 如下:

# 指定 cmake 版本,跟安装的版本保持一致
cmake_minimum_required(VERSION 3.4.1)

# 指定 c++ 标准
set(CMAKE_CXX_STANDARD 11)

# 输出编译信息
message("Hello Alan!!! Start compile!")

# 设置源码根路径,即 cpp 目录
set(SRC_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
message(${SRC_ROOT_PATH})

# 定义要编译的文件列表变量
file(GLOB CPP_FILES_IN_UTILS "${SRC_ROOT_PATH}/utils/*.cpp")

# 设置要编译的源文件
set(
        SOURCE_FILES
        ${CPP_FILES_IN_UTILS}
        ${SRC_ROOT_PATH}/main.cpp
)

# include 头文件目录
include_directories(${SRC_ROOT_PATH}/)

# 编译成可执行文件,如果编译动态库可以用:target_link_libraries
add_executable(audio_tool ${SOURCE_FILES})

编译步骤:

cd source (CMakeLists.txt 所在目录)
cmake .
make

执行:cmake .

再执行:make

编译出最终的可执行文件:audio_tool(在 CMakeLists 的 add_executable 指定的)

 使用时根据自己的 main 函数用就可以,比如要带一个参数,执行如下:

./audio_tool ../test/test.wav

 

  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
CMake是一个跨平台的构建系统。它可以自动生成Makefile或是Visual Studio的项目文件,以达到构建目标的效果。 静态编译指所有用到的第三方库都会被链接到最终的二进制文件中,因此这种方式生成的可执行文件可以在不同的机器上运行,而不必考虑库文件的路径和版本等问题。 下面是一个简单的CMakeLists.txt文件,用于生成一个静态编译可执行文件。 ```cmake cmake_minimum_required(VERSION 3.5) project(demo) set(CMAKE_CXX_COMPILER "g++") set(CMAKE_CXX_STANDARD 11) set(SOURCES main.cpp) set(LIBRARIES lib1 lib2) include_directories(include) add_executable(demo ${SOURCES}) target_link_libraries(demo ${LIBRARIES}) ``` 在这个例子中,我们定义了一个项目名称为demo,设置了编译器为g++,使用C++11标准进行编译。我们还定义了源码文件名为main.cpp,库文件名为lib1和lib2。在CMakeLists.txt中,我们通过add_executable命令将源码文件编译可执行文件,并通过target_link_libraries命令将库文件链接到可执行文件中。 在项目目录下执行以下指令: ```bash mkdir build && cd build cmake .. make ``` 即可在build目录下生成可执行文件demo。我们可以使用ldd命令查看可执行文件的依赖关系,发现所有依赖库都已经被链接到了二进制文件中。 ```bash ldd demo ``` 需要注意的是,静态编译可执行文件可能会比较大,因为它包含了所有的依赖库,因此需要权衡可执行文件的大小和可移植性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值