您的位置:首页 > 其它

CMake 实例学习(3)构建静态库

2016-09-07 12:59 274 查看
1:概述

   有了上一节共享库的工作,这节的就简单多了。

2: 目录结构

[onezeroone@ ex-4]$ tree

.

 build

 CMakeLists.txt

 lib

  CMakeLists.txt

  hello.c

  hello.h

 src

     CMakeLists.txt

     main.c

3 directories, 6 files

3:文件内容

   这里就不罗嗦了,直接看内容吧,参考前面共享库的制作,需要稍作修改就OK。

[onezeroone@ ex-4]$ cat
CMakeLists.txt

PROJECT(EX-4)

ADD_SUBDIRECTORY(lib)

现在是制作静态库时的状态,使用静态库的时候我们需要稍作修改。

[onezeroone@ ex-4]$ cat ./lib/CMakeLists.txt

SET(LIBHELLO_SRC hello.c)

ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})

INSTALL(TARGETS hello

        ARCHIVE DESTINATION lib)

INSTALL(FILES hello.h DESTINATION include/hello)

需要修改只有2处,STATIC表示要生成静态库,ARCHIVE表示指定静态库的路径。hello文件跟上一节一样。

跟上一节一样,我们cmake一把吧。

[onezeroone@ ex-4]$ cd
build/

[onezeroone@ build]$ cmake ..

-- The C compiler identification is GNU

-- The CXX compiler identification is GNU

-- Check for working C compiler: /usr/bin/gcc

-- Check for working C compiler: /usr/bin/gcc -- works

-- Detecting C compiler ABI info

-- Detecting C compiler ABI info - done

-- Check for working CXX compiler: /usr/bin/c++

-- Check for working CXX compiler: /usr/bin/c++ -- works

-- Detecting CXX compiler ABI info

-- Detecting CXX compiler ABI info - done

CMake Warning (dev) in CMakeLists.txt:

  No cmake_minimum_required command is present. A line of code such as

    cmake_minimum_required(VERSION 2.8)

  should be added at the top of the file. The version specified may be lower

  if you wish to support older CMake versions for this project. For more

  information run "cmake --help-policy CMP0000".

This warning is for project developers. Use -Wno-dev to suppress
it.

-- Configuring done

-- Generating done

-- Build files have been written to: /home/onezeroone/work/cmake/ex-4/build

[onezeroone@ build]$ make

Scanning dependencies of target hello

[100%] Building C object lib/CMakeFiles/hello.dir/hello.o

Linking C static library libhello.a

[100%] Built target hello

[onezeroone@ build]$ ls ./lib/

CMakeFiles cmake_install.cmake libhello.a Makefile

呵呵,看到我们的静态库了。

4:安装静态库

   安装前我们要制定安装路径,所以我们再重新构建吧。

[onezeroone@ build]$ cmake -DCMAKE_INSTALL_PREFIX=/usr ..

CMake Warning (dev) in CMakeLists.txt:

  No cmake_minimum_required command is present. A line of code such as

    cmake_minimum_required(VERSION 2.8)

  should be added at the top of the file. The version specified may be lower

  if you wish to support older CMake versions for this project. For more

  information run "cmake --help-policy CMP0000".

This warning is for project developers. Use -Wno-dev to suppress
it.

-- Configuring done

-- Generating done

-- Build files have been written to: /home/onezeroone/work/cmake/ex-4/build

[onezeroone@ build]$ make

[100%] Built target hello

[onezeroone@ build]$ sudo make
install

[100%] Built target hello

Install the project...

-- Install configuration: ""

-- Installing: /usr/lib/libhello.a

-- Up-to-date: /usr/include/hello/hello.h

我们可以看到已经安装到指定的/usr目录下面了。

5:使用静态库

   我们修改工程目录下的CMakeLists.txt文件

[onezeroone@ ex-4]$ cat
CMakeLists.txt

PROJECT(EX-4)

ADD_SUBDIRECTORY(src bin)

修改库路径为主程序路径,并指定生成bin文件路径。

[onezeroone@ src]$ cat
CMakeLists.txt

ADD_EXECUTABLE(main main.c)

INCLUDE_DIRECTORIES(/usr/include/hello)

TARGET_LINK_LIBRARIES(main libhello.a)

指定静态库文件。

再cmake一把把。

[onezeroone@ build]$ cmake ..

CMake Warning (dev) in CMakeLists.txt:

  No cmake_minimum_required command is present. A line of code such as

    cmake_minimum_required(VERSION 2.8)

  should be added at the top of the file. The version specified may be lower

  if you wish to support older CMake versions for this project. For more

  information run "cmake --help-policy CMP0000".

This warning is for project developers. Use -Wno-dev to suppress
it.

-- Configuring done

-- Generating done

-- Build files have been written to: /home/onezeroone/work/cmake/ex-4/build

[onezeroone@ build]$ make

Scanning dependencies of target main

[100%] Building C object bin/CMakeFiles/main.dir/main.o

Linking C executable main

[100%] Built target main

[onezeroone@ build]$ cd bin/

[onezeroone@ bin]$ ls

CMakeFiles cmake_install.cmake main Makefile

[onezeroone@ bin]$ ./main

Hello world

OK我们已经Hello world了,确认下吧。

[onezeroone@ bin]$ ldd
main

        linux-gate.so.1 => (0x00e09000)

        libc.so.6 => /lib/libc.so.6 (0x00110000)

        /lib/ld-linux.so.2 (0x0078f000)

不再是上一节的动态库了,OK,Done!

6:注

   这里只是简单的实例了cmake构建静态库,后面我们会逐渐丰富。

------------------------------------------------------------------

罗列一下cmake常用的命令。

CMake支持大写、小写、混合大小写的命令。

 

1. 添加头文件目录INCLUDE_DIRECTORIES

语法:
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])


它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。

include_directories(../../../thirdparty/comm/include)


 

2. 添加需要链接的库文件目录LINK_DIRECTORIES

语法:
link_directories(directory1 directory2 ...)


它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。

link_directories("/home/server/third/lib")


 

3. 查找库所在目录FIND_LIBRARY

语法:

A short-hand signature is:

find_library (<VAR> name1 [path1 path2 ...])
The general signature is:

find_library (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_CMAKE_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)


例子如下:

FIND_LIBRARY(RUNTIME_LIB rt /usr/lib  /usr/local/lib NO_DEFAULT_PATH)


cmake会在目录中查找,如果所有目录中都没有,值RUNTIME_LIB就会被赋为NO_DEFAULT_PATH

 

4. 添加需要链接的库文件路径LINK_LIBRARIES

语法:
link_libraries(library1 <debug | optimized> library2 ...)


# 直接是全路径
link_libraries(“/home/server/third/lib/libcommon.a”)

# 下面的例子,只有库名,cmake会自动去所包含的目录搜索
link_libraries(iconv)

# 传入变量
link_libraries(${RUNTIME_LIB})

# 也可以链接多个
link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")


可以链接一个,也可以多个,中间使用空格分隔.

 

5. 设置要链接的库文件的名称TARGET_LINK_LIBRARIES 

语法:
target_link_libraries(<target> [item1 [item2 [...]]]
[[debug|optimized|general] <item>] ...)


# 以下写法都可以:
target_link_libraries(myProject comm)       # 连接libhello.so库,默认优先链接动态库
target_link_libraries(myProject libcomm.a)  # 显示指定链接静态库
target_link_libraries(myProject libcomm.so) # 显示指定链接动态库

# 再如:
target_link_libraries(myProject libcomm.so)  #这些库名写法都可以。
target_link_libraries(myProject comm)
target_link_libraries(myProject -lcomm)


6. 为工程生成目标文件
语法:


add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])


简单的例子如下:

add_executable(demo
main.cpp
)


6. 最后贴一个完整的例子


cmake_minimum_required (VERSION 2.6)

INCLUDE_DIRECTORIES(../../thirdparty/comm)

FIND_LIBRARY(COMM_LIB comm ../../thirdparty/comm/lib NO_DEFAULT_PATH)
FIND_LIBRARY(RUNTIME_LIB rt /usr/lib /usr/local/lib NO_DEFAULT_PATH)

link_libraries(${COMM_LIB} ${RUNTIME_LIB})

ADD_DEFINITIONS(
-O3 -g -W -Wall
-Wunused-variable -Wunused-parameter -Wunused-function -Wunused
-Wno-deprecated -Woverloaded-virtual -Wwrite-strings
-D__WUR= -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DTIXML_USE_STL
)

add_library(lib_demo
cmd.cpp
global.cpp
md5.cpp
)

link_libraries(lib_demo)
add_executable(demo main.cpp )

# link library in static mode
target_link_libraries(demo libuuid.a)


另外,使用cmake生成makefile之后,make edit_cache可以编辑编译选项。

不熟悉的命令可以去查找文档,贴个cmake3.0官方帮助文档地址 https://cmake.org/cmake/help/v3.0/index.html[/code] 
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: