cmake编译dll,lib文件

最近,公司的代码编译从直接使用 GNU make 转向了 cmake.

下面介绍一下cmake 的使用

1)  cmake 的基本语法

cmake 可以看作一种脚本语言,它的一些语法和其他一下脚本语言(bash, python等)是相似的。

1.1 命令:

基本格式为

command(param)

命令可大写或者小写  (case-insensitive)

1.1 变量

引用变量 var的值: ${var}

给变量赋值:

  set(Foo a b c)  

或者

 set(Foo a;b;c)

Foo 的值为 a b c (一个 list)

$ENV{name} --》得到环境变量的值

2. 流程控制:

2.1 if 语句

[plain]  view plain copy print ?
  1. # some_command will be called if the variable's value is not:  
  2. # empty, 0, N, NO, OFF, FALSE, NOTFOUND, or -NOTFOUND.  
  3. if(var)  
  4.    some_command(...)  
  5. endif(var)   

2. loop:

[plain]  view plain copy print ?
  1. set(VAR a b c)  
  2.   # loop over a, b,c with the variable f  
  3. foreach(f ${VAR})  
  4.     message(${f})  
  5. endforeach(f)   
3. 宏和函数

[plain]  view plain copy print ?
  1. # define a macro hello  
  2. macro(hello MESSAGE)  
  3.     message(${MESSAGE})  
  4. endmacro(hello)  
  5. # call the macro with the string "hello world"  
  6. hello("hello world")  
  7. # define a function hello  
  8. function(hello MESSAGE)  
  9.     message(${MESSAGE})  
  10. endfunction(hello)   


下面举个例子来说明如何使用 cmake.

下面的例子中, 我们用 cmake 来生成静态库,动态库, 并使用生成的库文件.

代码树如下:

[plain]  view plain copy print ?
  1. .  
  2. ├── CMakeLists.txt  
  3. ├── FooFunctions  
  4. │   ├── CMakeLists.txt  
  5. │   ├── inc  
  6. │   │   └── foo.h  
  7. │   └── src  
  8. │       └── foo.c  
  9. ├── MathFunctions  
  10. │   ├── CMakeLists.txt  
  11. │   ├── inc  
  12. │   │   └── mysqrt.h  
  13. │   └── src  
  14. │       └── mysqrt.c  
  15. └── tutorial.c  
tutorial.c 是测试代码,  FooFunctions 下的文件生成共享库, mathFunctions 下的代码生成静态库.

top-level CMakeList.txt 如下:

[plain]  view plain copy print ?
  1. cmake_minimum_required (VERSION 2.6)  
  2.   2 project (Tutorial)  
  3.   3   
  4.   4 set(CMAKE_BUILD_TYPE Debug)  
  5.   5   
  6.   6 #message(status "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}")  
  7.   7 #message(status "PROJECT_BINARY_DIR = ${PROJECT_BINARY_DIR}")  
  8.   8 #message(status "CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")  
  9.   9 #message(status "CMAKE_BINARY_DIR = ${CMAKE_BINARY_DIR}")  
  10.  10   
  11.  11 include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions/inc")  
  12.  12 include_directories("${PROJECT_SOURCE_DIR}/FooFunctions/inc")  
  13.  13 add_subdirectory (MathFunctions)  
  14.  14 add_subdirectory(FooFunctions)  
  15.  15   
  16.  16 add_executable(Tutorial tutorial.c)  
  17.  17 target_link_libraries (Tutorial MathFunctions m FooFunctions)  
  18.  18 set_target_properties(Tutorial PROPERTIES RUNTIME_OUTPUT_DIRECTORY ../BIN)  

解释如下:

1) set(CMAKE_BUILD_TYPE Debug)

设置debug模式,也就是 gcc 加上 -g 选项

也可以用

set(CMAKE_C_FLAGS   ${CMAKE_C_FLAGS} "-g -Wall")


或者命令行设置:

cmake -DCMAKE_BUILD_TYPE=Debug/Release  dir


2) include_directories 

设置头文件的搜索路径.  相当于 C_FLAGS 加上 "-I" 

3)add_executable

设置生成的可执行文件

4) add_subdirectory  
设置包含 其它 CMakeLists.txt的目录.

一般,需要单独变成一个库的代码,都要有一个    CMakeLists.txt 

5)target_link_libraries 

设置要 link到可执行文件的库

6)set_target_properties

这里是设置可执行文件的位置


然后再看一下 FooFunctions 下的 CMakeLists.txt:

[plain]  view plain copy print ?
  1. set(shared_src src/foo.c)  
  2.  2 add_library(FooFunctions SHARED ${shared_src})  
  3.  3 include_directories("${PROJECT_SOURCE_DIR}/FooFunctions/inc")  
  4.  4 set_target_properties(FooFunctions PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/LIB)  
  5.  5 set_target_properties(FooFunctions PROPERTIES VERSION 1.1 SOVERSION 1)  
第二行是设置库为共享库, 最后一行设置生成的共享库版本:VERSION: build version; SOVERSION: API version

比如,最后生成的共享库如下:

[plain]  view plain copy print ?
  1. $ ls LIB/ -l  
  2. total 12  
  3. lrwxrwxrwx 1 charles charles   20 Feb 20 01:38 libFooFunctions.so -> libFooFunctions.so.1  
  4. lrwxrwxrwx 1 charles charles   22 Feb 20 01:38 libFooFunctions.so.1 -> libFooFunctions.so.1.1  
  5. -rwxrwxr-x 1 charles charles 7726 Feb 20 01:38 libFooFunctions.so.1.1  

MathFunctions 下的  CMakeLists.txt如下:

[plain]  view plain copy print ?
  1. 1 add_library(MathFunctions src/mysqrt.c)  
  2. 2 set_target_properties(MathFunctions PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CM    AKE_BINARY_DIR}/LIB)  
第一行是设置静态库


每一个 CMakeLists.txt 都会生成一组 Makefile文件.

其中主要的是 Makefile, link.txt 和 flags.make

link.txt 是用来生成可执行文件或者库的命令. flags.make 则是命令选项.

比如, top-level CMakeLists.txt 的 link.txt 为:

[plain]  view plain copy print ?
  1. charles@mikiehara:~/Code/cmake_tutorial/cmake/CMakeFiles/Tutorial.dir$ cat link.txt   
  2. /usr/bin/gcc  -g    CMakeFiles/Tutorial.dir/tutorial.c.o  -o ../BIN/Tutorial -rdynamic LIB/libMathFunctions.a -lm LIB/libFooFunctions.so.1.1 -Wl,-rpath,/home/charles/Code/cmake_tutorial/cmake/LIB   
flags.make  为:

[plain]  view plain copy print ?
  1. charles@mikiehara:~/Code/cmake_tutorial/cmake/CMakeFiles/Tutorial.dir$ cat flags.make   
  2. # CMAKE generated file: DO NOT EDIT!  
  3. # Generated by "Unix Makefiles" Generator, CMake Version 2.8  
  4.   
  5. # compile C with /usr/bin/gcc  
  6. C_FLAGS = -g -I/home/charles/Code/cmake_tutorial/MathFunctions/inc -I/home/charles/Code/cmake_tutorial/FooFunctions/inc     
  7.   
  8. C_DEFINES =  

你可能感兴趣的:(cmake编译dll,lib文件)