在linux中使用cmake构建共享库(动态链接库)

cmake是一种跨平台的构建工具。它可以生成各种平台支持的makefile和project文件。

在windows下,一般都是用visual studio来管理工程。

事实上,就本人来说,使用cmake主要是为了避免在linux下手写makefile的繁琐。

cmake在ubuntu下的安装:

sudo apt-get install cmake

下面来看如何使用cmake构建动态库。

假设我们的目录A下有两个代码文件:

add.h

#ifndef ADD_H
#define ADD_H
#include <stdio.h>
void add();
#endif


add.c

#include "add.h"
void add()
{
        printf("add\n");
}


下面将这两个文件编译为动态链接库。在文件夹A下创建CMakeLists.txt文件,内容如下:

SET(CMAKE_INSTALL_PREFIX / usr)                                 
project (lib)                                                                     
set(SRC add.c add.h)                                                      
add_library(add SHARED $ {SRC})                                 
INSTALL(FILES add.h DESTINATION include)                   
INSTALL(TARGETS add LIBRARY DESTINATION lib)        

以上6条cmake指令作用分别为:

(1)设置库的安装路径为/usr                              
(2)设置此工程名称
(3)设置此工程的源码
(4)设置输出的库的类型(SHARED)和名字(add)
(5)设置头文件的安装路径为usr下的include              
(6)设置库文件的安装路径为usr下的lib                    

然后依次输入

cmake .

sudo make install

(1)cmake后跟一个 . 是表示根据当前路径下的CMakeLists.txt进行构建。

(2)在make install前加sudo 是因为安装库文件和头文件实际上是拷贝到指定的目录,拷贝可能需要权限。在本例中sudo make install 等同于sudo cp add.h /usr/include 加上 sudo cp libadd.so /usr/lib 。

此时动态库和头文件就被安装到usr目录下的/lib和/include中了。

如果只为了构建一个动态库的话,是不需要安装到系统中的(即不需要(1),(5),(6)),不过如果不安装,那么每次在其他程序中使用此库的时候都需要手动指定路径,十分麻烦。

下面来看对动态库的使用。

在另一个文件夹下B创建一个源文件testadd.c

int main()
{
        add();
}


在文件夹B创建CMakeLists.txt

set(TEST_SRC  testadd.c)                                       #设置使用的文件
ADD_EXECUTABLE(main ${TEST_SRC})                  #设置输出的可执行文件名称为main
TARGET_LINK_LIBRARIES(main add)                     #设置add库链接到main文件

然后输入cmake . 生成makefile文件。

输入make执行makefile文件。

输入 ./main 就可以看到程序调用了动态库打印出了"add"。

之所以要分文件夹A和B来演示,是因为链接的时候会首先根据库名先在本文件夹下搜索库文件,然后再去环境变量设置的路径搜索,分成两个文件夹是为了证明库被正确的安装了。
 

windows的动态库使用直接在vs中设置就可以了。

网上有一篇很好的cmake入门教程,这里是:下载链接

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 在CMake使用动态链接库,需要使用以下几个命令: 1. `find_package()` 命令:用于查找需要链接的动态。 2. `target_link_libraries()` 命令:用于将需要链接的动态添加到目标可执行文件。 下面是一个示例 CMakeLists.txt 文件,其包含了以上两个命令: ``` cmake_minimum_required(VERSION 3.0) project(my_project) # 查找需要链接的动态 find_package(MyLib REQUIRED) # 添加可执行文件 add_executable(my_executable main.cpp) # 将需要链接的动态添加到可执行文件 target_link_libraries(my_executable MyLib::MyLib) ``` 在这个示例CMake 使用 `find_package()` 命令查找名为 `MyLib` 的动态,并将其添加到 `my_executable` 可执行文件。注意,`target_link_libraries()` 命令使用了 `MyLib::MyLib`,这是因为 CMake 会自动为 `MyLib` 生成一个别名。 另外,需要在 `CMakeLists.txt` 文件指定 `MyLib_DIR` 变量的值,以告诉 CMake 的位置。可以通过以下命令来指定: ``` set(MyLib_DIR /path/to/MyLib) ``` 在这个命令,将 `/path/to/MyLib` 替换为实际的文件路径。 ### 回答2: CMake是一个跨平台的构建工具,可以帮助开发人员构建、测试和打包软件项目。在CMake使用动态链接库是非常常见的。 动态链接库也称为共享,它是在运行时被加载到内存并被多个程序共享的代码和数据。相比于静态链接动态链接库能够使得程序的体积更小,同时也提供了模块化的扩展性。 使用CMake处理动态链接库需要以下几个步骤: 1. 创建动态链接库项目:首先,在CMakeLists.txt文件使用add_library命令创建动态链接库项目,指定项目的名称和源代码文件。 2. 设置的类型:通过在add_library命令添加关键字SHARED,指示CMake创建一个动态链接库。例如,add_library(mylib SHARED mylib.cpp)。 3. 指定链接的其他:如果动态链接库依赖于其他的,可以使用target_link_libraries命令指定这些依赖。例如,target_link_libraries(mylib otherlib)。 4. 安装:通过在CMakeLists.txt文件添加install命令,将动态链接库安装到指定位置。例如,install(TARGETS mylib LIBRARY DESTINATION lib)。 使用CMake构建使用动态链接库时,我们需要在应用程序的CMakeLists.txt文件定义用于目标链接的,并使用target_link_libraries命令添加需要链接的动态链接库。然后在应用程序源代码文件通过include_directories命令指定头文件路径,并使用的函数和数据。 总之,CMake提供了方便的方式来处理动态链接库,通过合理使用动态链接库,我们可以更好地组织和管理代码,提高程序的可维护性和扩展性。使用CMake动态链接库功能,我们能够简化构建过程并提高开发效率。 ### 回答3: CMake是一个开源的跨平台的构建工具,它可以用来自动生成与平台相关的构建文件,包括Makefile和Visual Studio项目文件等。使用CMake,我们可以方便地管理和构建项目。 在CMake使用动态链接库有两个主要步骤: 1. 定义动态链接库: 首先,我们需要定义我们的动态链接库。在CMakeLists.txt文件,我们可以使用add_library命令来定义动态链接库。例如,以下命令可以创建一个名为mylib的动态链接库: add_library(mylib SHARED src1.cpp src2.cpp) 这里的src1.cpp和src2.cpp是包含所需功能的源文件。 2. 使用动态链接库: 一旦我们定义了动态链接库,我们就可以在其他目标或可执行文件使用它。我们可以使用target_link_libraries命令将动态链接库与目标文件关联起来。例如,以下命令将名为myapp的可执行文件与mylib动态链接库关联: add_executable(myapp main.cpp) target_link_libraries(myapp mylib) 在这里,main.cpp是我们的主程序源文件。 通过这两个步骤,我们成功地将动态链接库与目标文件关联起来,并且在构建使用动态链接库。当我们构建项目时,CMake会自动处理动态链接库的依赖关系和连接过程。 总的来说,使用CMake可以轻松地管理动态链接库,并将其与我们的项目或可执行文件一起构建。这样,我们可以更加灵活和高效地开发和维护我们的项目。 注意:在以上的示例,我们假设mylib的源文件和myapp的源文件在同一个目录下。如果不是这种情况,我们需要修改add_library和target_link_libraries命令的路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值