此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上都可以,代码是免费的,点击下载即可