如何根据vs工程构建makefile文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据vs工程构建makefile文件相关的知识,希望对你有一定的参考价值。

1、用makefile.ammakefile.in的,需要用automake生成的;  

2、如果在windows下,需要装Cygwin再装automake;  

3、然后生成相应的config文件和Makefile;  

4、如果是工程文件的,需要新建工程,然后倒入所有源代码。  makefile  一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
参考技术A 根据vs工程构建makefile文件 :namke.exe: 是基于makefile来编译代码的 Visual Studio 附带的命令行工具。要使用 nmake,必须在开发人员命令提示窗口中运行它。 开发人员命令提示窗口具有为工具、库设置的环境变量,并且包括在命令行上生成所需的文件路径。
安装vs之后,就可以找到nmake.exe了。

使用CMake构建复杂工程

本文中所有代码:https://git.coding.net/autophyte/soTest.git


 

0. 什么是CMake

  CMake是一个跨平台的编译、安装、测试以及打包工具;CMake不直接编译软件,而是结合原生构建系统来构建软件。CMake配置文件是CMakeList.txt文件(每个源码文件夹下都要有一个),CMake根据配置文件在生成Unix的Makefile或VS的solution文件等。

1. 为什么选CMake

  别人为什么选CMake我不清楚,我是因为在Linux上直接写Makefile太痛苦,而项目又会跨平台,Windows和Linux都要有

2. 用一个简单工程来说明CMake用法。

  • 工程名soTest,里面包含一个两个so(dll)文件:so1和so2,以及一个测试工程st
  • 工程内文件结构如下:
    • 文件so1/so1.c:用于生成libso1.so
    • 文件so2/so2.c:用于生成libso2.so,依赖于libso1.so,会调用libso1.so内函数
    • 文件test/test.c:生成可执行文件,调用libso2.so,调用libso2.so内函数
    • 文件test/test.py:使用python调用libso2.so函数
    • build目录用于存放编译时和种文件,这样可以保持源代码文件夹干净
    • 文件结构
    • 可以看,每个目录下都有一个CMakeList.txt的文件,这些文件就是CMake的配置文件,CMake就是根据这些文件来生成其他构建文件的

3. 项目代码如下:

  

1 // so1/so1.c
2 int add_fun(int a, int b)
3 {
4     return a+b;
5 }
1 // so1.h
2 #ifndef _so1_h_
3 #define _so1_h_
4 
5 int add_fun(int a, int b);
6 int fun_test(int a);
7 
8 #endif//_so1_h_
 1 // so2/so2.h
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include "so1.h"
 5 
 6 int fun_test(int a)
 7 {
 8     for (int i=0; i<a; ++i)
 9     {
10         printf("add_fun(%d+%d)=%d\\n", i, i, add_fun(i, i));
11     }
12     
13     return 0;
14 }
 1 // test/test.c
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 #include "so1.h"
 6 
 7 int main(int argc, char **argv)
 8 {
 9     return fun_test(9);
10 }
 1 # ./CMakeLists.txt,工程总配置文件
 2 
 3 # 最低版本要求,必须
 4 cmake_minimum_required(VERSION 3.0)
 5 
 6 # 工程名称,这里用soTest这个名字
 7 project(soTest)
 8 
 9 # 添加include目录,本例头文件在./目录下,所以直接取${PROJECT_SOURCE_DIR}/
10 include_directories(${PROJECT_SOURCE_DIR}/)
11 
12 # 添加链接库查找目录,库查找序按照参数顺序从向右查
13 link_directories(${PROJECT_BINARY_DIR}/libs /usr.local/libs /usr/lib)
14 
15 # 设置生成的库文件目录,这里我们设置成和库目录相同
16 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/libs)
17 
18 # 设置可执行文件目录,同样设成和库目录相同
19 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/libs)
20 
21 # 添加子目录(每个子目录下都必须有自已的CMakeLists.txt文件
22 add_subdirectory(so1)
23 add_subdirectory(so2)
24 add_subdirectory(test)
# ./so1/CMakeLists.txt
# project name: soTest
project(soTest)

# set source files
set(so1 so1.c)

# set make to a shared library
add_library(so1 SHARED ${so1})
 1 # ./so2/CMakeLists.txt
 2 
 3 project(soTest)
 4 set(so2 so2.c)
 5 add_library(so2 SHARED ${so2})
 6 
 7 # link so1
 8 target_link_libraries(so2 so1)
1 project(soTest)
2 set(st test.c)
3 
4 # 生成可执行文件
5 add_executable(st test.c)
6 target_link_libraries(st so2 so1)

4. CMake支持在源文件目录外进行构建,这里我们选择在./build目录下进行构建,好处是不会把源文件目录污染,在build目录下运行命令(命令后参数是总CMakeLists.txt文件所在目录):

cmake .. && make && ./libs/st

  命令运行后结果如下

  

以上是关于如何根据vs工程构建makefile文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 makefile 中包含和编译库

Makefile 多目录自动编译

如何自己编写Makefile

linux工程构建:make,cmake

第四部分Makefile总述

makefile 工程管理