cmake命令编译动态库并保存
时间: 2023-09-11 17:04:06 浏览: 81
要使用CMake命令编译动态库并保存,你可以按照以下步骤进行操作:
1. 创建一个CMakeLists.txt文件,指定你的项目信息和源文件。
2. 添加以下代码到CMakeLists.txt中,用于生成动态库:
```
add_library(your_library_name SHARED your_source_files)
```
其中,your_library_name是你要生成的动态库的名称,your_source_files是你的源文件。
3. 在终端中进入到你的项目目录中,创建一个build文件夹用于存放生成的动态库文件。
4. 执行以下命令来生成动态库文件:
```
cmake -S . -B ./build
cmake --build ./build
```
其中,-S指定CMakeLists.txt所在的路径,-B指定生成文件的路径。
5. 编译完成后,你可以在./build文件夹中找到你生成的动态库文件。
相关问题
cmake里面引入动态库 并使用的例子
假设有一个名为`myapp`的可执行文件,需要引入名为`libfoo.so`的动态库并使用其中的函数,可以按照以下步骤进行:
1. 创建`CMakeLists.txt`文件,并在其中添加以下内容:
```
cmake_minimum_required(VERSION 3.5)
project(myapp)
add_executable(myapp main.cpp)
find_library(foo NAMES foo PATHS /usr/local/lib)
target_link_libraries(myapp ${foo})
```
其中,`main.cpp`是`myapp`的源文件,`foo`是要引入的动态库的名称,`/usr/local/lib`是`libfoo.so`所在的路径。
2. 创建`main.cpp`文件,并在其中使用`libfoo.so`中的函数:
```c++
#include <iostream>
#include <dlfcn.h>
typedef int (*foo_func_t)(int, int);
int main()
{
void *handle = dlopen("libfoo.so", RTLD_LAZY);
if (!handle) {
std::cerr << "Error: " << dlerror() << std::endl;
return 1;
}
foo_func_t foo_func = (foo_func_t)dlsym(handle, "foo");
if (!foo_func) {
std::cerr << "Error: " << dlerror() << std::endl;
dlclose(handle);
return 1;
}
int result = foo_func(3, 4);
std::cout << "Result: " << result << std::endl;
dlclose(handle);
return 0;
}
```
在`main.cpp`中,首先使用`dlopen`函数打开`libfoo.so`动态库,然后使用`dlsym`函数获取其中的`foo`函数,并将其保存到函数指针变量`foo_func`中。最后,调用`foo_func`函数并输出结果。
注意,这里使用了`dlfcn.h`头文件中的函数,需要在编译时链接`dl`库,可以在`CMakeLists.txt`中添加以下命令:
```
target_link_libraries(myapp dl)
```
3. 在命令行中执行以下命令进行编译:
```
mkdir build
cd build
cmake ..
make
```
编译完成后,可以运行`myapp`可执行文件,输出结果应为`Result: 7`。
cmake 封装动态库
对于使用CMake封装动态库,你可以按照以下步骤进行操作:
1. 创建一个文件夹用于存放你的项目文件,并进入该文件夹。
2. 在该文件夹下创建一个CMakeLists.txt文件,用于配置CMake构建过程。
3. 在CMakeLists.txt中,使用`add_library()`命令来定义动态库。例如,如果你要创建一个名为"mylib"的动态库,可以像这样写:
```
add_library(mylib SHARED
source1.cpp
source2.cpp
)
```
4. 在`add_library()`命令后面,列出你的源文件,它们将被编译成动态库。
5. 如果你的库依赖于其他库,可以使用`target_link_libraries()`命令来链接它们。例如,如果你的库依赖于名为"otherlib"的库,可以像这样写:
```
target_link_libraries(mylib otherlib)
```
6. 在CMakeLists.txt中,你还可以根据需要添加其他的配置选项,例如编译标志、包含路径等。
7. 保存CMakeLists.txt并退出编辑器。
8. 打开终端并进入你的项目文件夹。
9. 运行以下命令来生成构建文件:
```
cmake .
```
10. 运行以下命令进行编译:
```
make
```
11. 编译完成后,你将在当前文件夹下生成一个动态库文件(通常是以.so为后缀的文件)。
现在,你已经成功地使用CMake封装了一个动态库。你可以在其他项目中使用这个库,并在需要的时候链接它。希望这能帮到你!如果有任何问题,请随时询问。
阅读全文
相关推荐















