ps:使用CMake来构建动态链接库可以让项目更加易于管理和构建。
下面我将演示如何使用CMake来构建一个名为“mylib”的动态链接库。

首先,创建一个名为“mylib”的文件夹,并在其中创建一个名为“mylib.h”的头文件和一个名为“mylib.cpp”的源文件

mylib.h

#ifndef MYLIB_H
#define MYLIB_H

extern "C" {
    int myFunction(int x, int y);
}

#endif // MYLIB_H

mylib.cpp

#include "mylib.h"

int myFunction(int x, int y)
{
    return x + y;
}

CMakeLists.txt

创建一个名为“CMakeLists.txt”的文件,用于描述项目的构建过程。CMake将会生成一个名为“libmylib.so”的动态链接库。

cmake_minimum_required(VERSION 3.5)
project(mylib VERSION 1.0.0)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# Create a shared library
add_library(mylib SHARED
    mylib.cpp
)

target_include_directories(mylib PUBLIC
    ${PROJECT_SOURCE_DIR}
)

CMakeLists.txt解释

  • cmake_minimum_required(VERSION 3.5)指定需要使用的CMake的最低版本。
  • project(mylib VERSION 1.0.0)指定项目的名称和版本。
  • set(CMAKE_CXX_STANDARD 11)指定使用C++11标准。
  • set(CMAKE_CXX_STANDARD_REQUIRED True)指定必须使用C++11标准。
  • add_library(mylib SHARED mylib.cpp)创建一个名为“mylib”的动态链接库,将“mylib.cpp”源文件编译成一个共享库。
  • target_include_directories(mylib PUBLIC ${PROJECT_SOURCE_DIR})将当前目录添加到mylib库的include路径中。

开始编译

在“mylib”文件夹中创建一个名为“build”的文件夹,并进入该文件夹。

mkdir build && cdn build

然后运行以下命令:

cmake ..
make

这将生成一个名为“libmylib.so”的动态链接库文件,它可以在其他程序中动态加载和链接。

引用动态链接库

例如,可以创建一个名为“test.cpp”的程序,该程序使用上述动态链接库:


#include <iostream>
#include "mylib.h"
#include <dlfcn.h>

int main()
{
    void* handle = dlopen("./libmylib.so", RTLD_LAZY);

    if (!handle) {
        std::cerr << "Error: " << dlerror() << std::endl;
        return 1;
    }

    typedef int (*myFunction_t)(int, int);
    myFunction_t myFunction = (myFunction_t) dlsym(handle, "myFunction");

    if (!myFunction) {
        std::cerr << "Error: " << dlerror() << std::endl;
        dlclose(handle);
        return 1;
    }

    int result = myFunction(1, 2);
    std::cout << "Result: " << result << std::endl;

    dlclose(handle);
    return 0;
}

使用以下命令编译该程序:

g++ test.cpp -ldl -L../build -lmylib -o test

编译命令的解释

  • test.cpp是程序源文件。
  • ldl选项告诉GCC链接到动态链接器库,因为程序需要动态链接库函数的支持。
  • L../build选项告诉GCC在指定的目录中查找库文件。
  • lmylib选项告诉GCC链接到名为“mylib”的库。
  • -o test选项告译GCC将编译生成的可执行文件保存到名为“test”的文件中。

成功运行并且输出:

Result: 3
04-11 09:51