CMake 构建一个库文件,并进行调用

一、建立libfile和binfile两个文件夹。其中libfile为库文件,放编译的库文件。binfile文件放可执行程序和文件。

二、libfile文件夹结构如下:

         

     1、build为编译文件夹,lib为源代码文件夹。各个文件夹下面都有一个CMakeLists.txt文件。

      主工程目录下(libfile/)的CMakeLists.txt文件内容如下:

cmake_minimum_required(VERSION 2.8)  #版本声明

project(HELLO)              #工程名称

add_subdirectory(lib)         # 向当前工程中添加存放源文件的目录

2、lib中的CMakeLists.txt文件内容为:

cmake_minimum_required(VERSION 2.8)

add_library(hello SHARED hello.cpp)     # 将hello.cpp编译成名为libhello.so的共享库
include_directories(/usr/local/include)  # 添加头文件的搜索路径

install(TARGETS hello              # 指定共享库libhello.so的安装路径
       LIBRARY DESTINATION lib)
install(FILES hello.h DESTINATION include)  # 指定hello.h的安装路径

hello.cpp中的内容为:

#include "hello.h"
#include <iostream>

void sayHello() {std::cout<<"Hello SLAM"<<std::endl;}

hello.h中内容为:

#pragma once
void sayHello(); 

3、开始用cmake来构建编译安装:

mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/tmp/local ..
make
make install   #若上面是安装在 /usr目录下(即:cmake -DCMAKE_INSTALL_PREFIX=/usr ..)
               #则在此处就应该用 sudo make install 来执行安装

此时,hello.cpp就被编译成libhello.so的共享库,位于/libfile/build/lib目录下,且最后被安装在:/tmp/local/bin目录中。

头文件hello.h被安装在: /tmp/local/include 目录中。

三、binfile文件结构如下

 

1、主工程目录(binfile/)下的CMakeLists.txt文件的内容为:

cmake_minimum_required(VERSION 2.8)
project(HELLO)
add_subdirectory(src bin)  # 将源文件所在的目录src添加到工程中,并且将编译的结果
                 # 输出为指定的目录bin下(包含中间结果)。若省略则将在
                 # 编译的目录中默认建立src目录来存放输出结果。如在build目录
                 # 编译将会输出到build/src目录。

2、在binfile/src/ 目录下的CMakeLists.txt文件中的内容如下:

cmake_minimum_required(VERSION 2.8)

add_executable(useHello useHello.cpp)   #将useHello.cpp编译成可执行文件useHello
include_directories(/tmp/local/include)   
include_directories(/tmp/local/lib)
target_link_libraries(useHello libhello.so)   #将可执行文件useHello链接到库文件 
                                              # libhello.so上,使useHello可以使用
                           #库文件中的内容。

3、主函数useHello.cpp文件内容如下,为调用库文件中的函数sayHello(), 

#include "hello.h"

int main( int argc, char** argv ) {
  sayHello();
}

4、构建编译可执行文件:

mkdir build
cd build
cmake ..
make
  •   在编译可执行文件时,当执行到make命令时,提示usr/bin/ld: cannot find -lxxx的问题。在编译的时候找不到库文件,由于在上面安装库文件时,安装路径为: /tmp/local/lib,而编译的时候会去系统的:/usr/lib 中寻找安装的库文件。所以由于/usr/lib中没有安装的库文件,就提示错误。此时应该在:/usr/lib 中建立 /tmp/local/lib/libhello.so 文件的软连接如下所示。
  •   /usr/lib/libhello.so 为 /tmp/local/lib/libhello.so 的软连接:
    sudo ln -s /tmp/local/lib/libhello.so  /usr/lib/libhello.so

5、执行build/bin目录中生成的可执行文件,将会调用库文件中函数输出内容。

参考资料:

[1] https://stackoverflow.com/questions/16710047/usr-bin-ld-cannot-find-lnameofthelibrary#

[2] http://blog.51cto.com/eminzhang/1285705

[3] https://www.cnblogs.com/zhming26/p/6164131.html

[4] https://www.cnblogs.com/52php/p/5681718.html

猜你喜欢

转载自blog.csdn.net/Jeffxu_lib/article/details/85874144