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