Cmake 简易使用

版权声明:本文为博主原创文章,转载请附上原文链接。 https://blog.csdn.net/Raito__/article/details/83379903

Cmake 简易使用

环境

CentOS 7.2
gcc (GCC) 4.8.5
cmake version 2.8.12.2
GNU Make 3.82

单个文件的编译

main.cpp

// main.cpp
#include<iostream>

int main()
{
    std::cout<<"Hello word!"<<std::endl;
    return 0;
}

CMakeLists.txt

# CMakeLists.txt
# 指定项目名称为main
PROJECT(main)

# 限定cmake最小版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

# 将当前目录源文件赋给变量DIR_SRCS
# aux_source_directory(<dir> <variable>)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)

# 指示DIR_SRCS下的文件需要编译成一个可执行文件
ADD_EXECUTABLE(main ${DIR_SRCS})

cmake结果

[root@localhost debug]# cmake ..
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- 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
-- Configuring done
-- Generating done
-- Build files have been written to: /code/debug

make结果

[root@localhost debug]# make
-- Configuring done
-- Generating done
-- Build files have been written to: /code/debug
Scanning dependencies of target main
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX executable main
[100%] Built target main

多源文件目录处理方法

代码结构

cpp
|
+--- main.cpp
|
+--- src
      |
      +--- Test.h
      |
      +--- Test.cpp

main.cpp

# include "Test.h"
using namespace std;

void Test()
{
    cout << "Test." << endl;
}

Test.h

# include <iostream>

void Test();

Test.cpp

# include "Test.h"
using namespace std;

void Test()
{
    cout << "Test." << endl;
}

cpp/CMakeLists.txt

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
ADD_SUBDIRECTORY(src)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})

# 指明可执行文件 main 需要链接一个名为Test的链接库
TARGET_LINK_LIBRARIES(main Test)

cpp/src/CmakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS)

# 将 src 目录中的源文件编译为共享库
ADD_LIBRARY(Test ${DIR_TEST1_SRCS})

cmake结果
在执行 cmake 的过程中,首先解析目录 cpp 中的 CMakeLists.txt ,当程序执行命令 ADD_SUBDIRECTORY( src ) 时进入目录 src 对其中的 CMakeLists.txt 进行解析。

[root@localhost debug]# cmake ..
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- 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
-- Configuring done
-- Generating done
-- Build files have been written to: /code/cpp/debug

make结果

[root@localhost debug]# make
Scanning dependencies of target Test
[ 33%] Building CXX object src/CMakeFiles/Test.dir/Test.cpp.o
[ 66%] Building CXX object src/CMakeFiles/Test.dir/Test1.cpp.o
Linking CXX static library libTest.a
[ 66%] Built target Test
Scanning dependencies of target main
[100%] Building CXX object CMakeFiles/main.dir/main.cpp.o
Linking CXX executable main
[100%] Built target main

使用第三方库

先编译一个待使用的第三方库,代码如下

// Test.h
#include <iostream>

void Test();
// Test.cpp
#include "Test.h"
using namespace std;

void Test()
{
    cout << "Test()." << endl;
}

编译命令

g++ Test.cpp -fPIC --shared -o libtest.so

将头文件和动态链接库放到指定位置

cp libtest.so /usr/lib64/
cp Test.h /usr/include/

项目代码结构,代码见附件 cmake_test.tar.gz

cpp
|
+--- main.cpp
|
+--- CMakeLists.txt
|
+--- cmake
      |
      +--- modules
              |
              +--- Findlibtest.cmake

cpp/CMakeLists.txt

PROJECT(main)
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(CMAKE_SOURCE_DIR .)
SET(CMAKE_MODULE_PATH ${CMAKE_ROOT}/Modules ${CMAKE_SOURCE_DIR}/cmake/modules)
AUX_SOURCE_DIRECTORY(. DIR_SRCS)
ADD_EXECUTABLE(main ${DIR_SRCS})
FIND_PACKAGE(libtest REQUIRED)
MARK_AS_ADVANCED(
LIBDB_CXX_INCLUDE_DIR
LIBDB_CXX_LIBRARIES
)
IF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES)
MESSAGE(STATUS "Found libdb libraries")
INCLUDE_DIRECTORIES(${LIBDB_CXX_INCLUDE_DIR})
MESSAGE(${LIBDB_CXX_LIBRARIES} )
TARGET_LINK_LIBRARIES(main ${LIBDB_CXX_LIBRARIES})
ENDIF (LIBDB_CXX_INCLUDE_DIR AND LIBDB_CXX_LIBRARIES)

cpp/cmake/module/Findlibtest.cmake

MESSAGE(STATUS "Using bundled Findlibdb.cmake...")
FIND_PATH(
LIBDB_CXX_INCLUDE_DIR
Test.h
/usr/include/
/usr/local/include/
)

FIND_LIBRARY(
LIBDB_CXX_LIBRARIES NAMES  test
PATHS /usr/lib64/ /usr/local/lib/
)

猜你喜欢

转载自blog.csdn.net/Raito__/article/details/83379903