cmake使用进阶版【多启动工程,多静态库链接】

2 篇文章 0 订阅

此cmake工程存在两个启动程序,也就是支持两个main函数存在,可以生成两个exe,并且能在windows和linux下运行,可跨平台使用,此博客是基于另一个博客进行改进的,代码和博主的一样,只是他的工程在windows下编译不通过,于是自己研究,并新增了支持多启动工程的方法。

工程启动后是这样的,其中main工程和test工程都可以生成可执行程序,可设置为启动项目

代码结构如下

mainProject
|-- CMakeLists.txt
|-- main
|   |-- CMakeLists.txt
|   `-- main.cpp
|-- math
|   |-- add.cpp
|   |-- add.h
|   `-- CMakeLists.txt
|-- test
|   |-- CMakeLists.txt
|   `-- main.cpp
`-- utility
    |-- CMakeLists.txt
    |-- utils.cpp
    `-- utils.h

main目录main.cpp

#include <iostream>
#include <string>

#include "../math/add.h"
#include "../utility/utils.h"

int main()
{
    int ret_add;
    std::cout << "Hello, this is my first cmake sample" << std::endl;
    printmsg("Hello world!");
    ret_add = Add(1, 2);
    return 0;
}

main目录CMakeLists.txt

message(STATUS "Enter main folder")
set(MODULE_MAIN    main)

SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/bin")			# 设置可执行文件的输出目录为bin目录

include_directories ("${CMAKE_SOURCE_DIR}/math")				# 添加头文件目录
include_directories ("${CMAKE_SOURCE_DIR}/utility")				# 添加头文件目录

LINK_DIRECTORIES("${PROJECT_BINARY_DIR}/lib")					# 添加lib目录为静态库目录

set(LIBS utility math)											# 添加我生成的两个库文件名

add_executable(${MODULE_MAIN} main.cpp)							# add_executable用于生成执行文件的地方

target_link_libraries(main ${LIBS})								# 生成可执行文件main,需要把连接库给带上,添加库文件名不需要指定文件路径,cmake会自己找

test目录main.cpp

#include <iostream>
#include <string>

#include "../math/add.h"
#include "../utility/utils.h"

int main()
{
    int ret_add;
    std::cout << "Hello, this is my first cmake sample" << std::endl;
    printmsg("Hello world!");
    ret_add = Add(1, 2);
    return 0;
}

test目录CMakeLists.txt

message(STATUS "Enter test folder")
set(MODULE_MAIN    test)

include_directories ("${CMAKE_SOURCE_DIR}/math")
include_directories ("${CMAKE_SOURCE_DIR}/utility")

LINK_DIRECTORIES("${PROJECT_BINARY_DIR}/lib")			# 添加lib目录为静态库目录

set(LIBS utility math)

add_executable(${MODULE_MAIN} main.cpp)					# add_executable用于生成执行文件的地方

target_link_libraries(test ${LIBS})						# 此举是将utility和math链接到main里面,然后在add_executable生成可执行文件test

math目录add.h

// add.h
#ifndef __CMAKE_ADD__
#define __CMAKE_ADD__

int Add(int t1, int t2);

#endif

math目录add.cpp

//add.cpp
#include <iostream>

#include "add.h"

int Add(int t1, int t2)
{
    int result = t1 + t2;
    std::cout << t1 << " + " << t2 << " is: " << result << std::endl;
    return result;
}

math目录CMakeLists.txt

message(STATUS "Enter math folder")
set(MODULE_MATH    math)

SET(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib")							# 设置lib库输出路径

add_library(${MODULE_MATH} add.cpp add.h) #编译add.cpp add.h生成静态库文件math,同时工程名也变成math

utility目录的utils.h

//utils.h
#ifndef __CMAKE_UTILS__
#define __CMAKE_UTILS__
#include <iostream>
#include <string>

void printmsg(std::string msg);

#endif

utility目录的utils.cpp

#include "utils.h"

void printmsg(std::string msg)
{
    std::cout << msg << std::endl;
}

utility目录的CMakeLists.txt

message(STATUS "Enter utility folder")
set(MODULE_UTILITY    utility)

SET(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib")	# 设置lib库输出路径

add_library(${MODULE_UTILITY} utils.cpp utils.h)		# 编译utils.cpp utils.h生成静态库文件utility,同时工程名也变成utility

使用GUI版本的cmake生成工程,打开后工程结构是这样的

编译结果:

windows上编译成功:

Linux上编译成功:

总结:

1、add_library是生成库文件,添加源文件,和需要生成的库文件名

2、set(MODULE_UTILITY    utility)设置工程名称为utility

3、target_link_libraries,将库文件连接起来,生成另一个库

4、add_executable添加main函数所在的源文件,并生成可执行文件

5、include_directories添加头文件目录

6、add_subdirectory添加当前CMakeLists.txt所在目录下的子目录,外层的CMakeLists.txt需要使用到这个方法

7、SET(LIBRARY_OUTPUT_PATH "${PROJECT_BINARY_DIR}/lib")   设置lib库输出路径,这个很重要,没有统一的静态库目录,编译会出现很多的麻烦

8、SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_BINARY_DIR}/bin")    设置可执行文件的输出目录为bin目录

 

需要我源代码的,可以直接下载,自己试一下,改动参数,自己编译,windows上或者linux上都可以,代码是免费的,点击下载即可

https://download.csdn.net/download/shejun6/13231825

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

佘军6

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

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

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

打赏作者

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

抵扣说明:

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

余额充值