cmake中给执行文件链接动态库和静态库的例子
时间: 2023-10-25 17:07:04 浏览: 194
以下是一个CMakeLists.txt文件的例子,展示了如何链接动态库和静态库:
```
cmake_minimum_required(VERSION 3.5)
project(my_project)
# 添加动态库路径
link_directories(/path/to/dynamic/library)
# 添加静态库路径
link_directories(/path/to/static/library)
# 添加可执行文件
add_executable(my_exe main.cpp)
# 链接动态库
target_link_libraries(my_exe libdynamic.so)
# 链接静态库
target_link_libraries(my_exe libstatic.a)
```
其中,`/path/to/dynamic/library`和`/path/to/static/library`分别是动态库和静态库所在的路径。
注意,在Linux下,动态库的扩展名为`.so`,静态库的扩展名为`.a`。如果使用的是Windows下的库文件,则需要使用`.dll`或`.lib`扩展名。
相关问题
cmake中,动态库如何调用静态库
### 回答1:
在 CMake 中,可以使用 `add_library` 命令来添加静态库或动态库。
举个例子,假设你想要调用一个名为 `mylib` 的静态库,并且该库已经在你的工程中被添加了,你可以这样做:
```
# 为 mylib 静态库添加一个别名
add_library(mylib_alias STATIC IMPORTED)
# 设置 mylib 静态库的路径
set_target_properties(mylib_alias PROPERTIES
IMPORTED_LOCATION "/path/to/libmylib.a"
)
# 为你的可执行文件 myapp 添加链接库
add_executable(myapp main.c)
# 将 mylib_alias 链接到 myapp 上
target_link_libraries(myapp mylib_alias)
```
在这里,我们使用了 `add_library` 命令来为 `mylib` 静态库添加了一个别名 `mylib_alias`,然后使用了 `set_target_properties` 命令来设置 `mylib_alias` 的位置。最后,使用了 `target_link_libraries` 命令将 `mylib_alias` 链接到了可执行文件 `myapp` 上。
这样就完成了在 CMake 中动态库调用静态库的过程。希望这对你有帮助。
### 回答2:
在CMake中,可以通过以下几个步骤来实现动态库调用静态库:
1. 在CMakeLists.txt文件中,添加静态库的目录,可以使用`link_directories()`函数来指定目录。例如,假设静态库位于`/path/to/static_lib`目录下,可以使用以下命令添加目录:
```cmake
link_directories(/path/to/static_lib)
```
2. 在CMakeLists.txt文件中,使用`add_library()`函数添加动态库,并使用`target_link_libraries()`函数将静态库链接到动态库上。例如,可以按照以下方式添加动态库和链接静态库:
```cmake
add_library(my_dynamic_lib SHARED my_dynamic_lib.cpp)
target_link_libraries(my_dynamic_lib my_static_lib)
```
其中,`my_dynamic_lib`为动态库名称,`my_dynamic_lib.cpp`为动态库的源文件名,`my_static_lib`为静态库的名称。
3. 在调用动态库的代码中,通过包含对应的头文件来使用动态库的函数和变量。例如,在源文件中,可以使用以下方式包含头文件和调用函数:
```cpp
#include <my_dynamic_lib.h>
int main() {
my_function(); // 调用动态库中的函数
return 0;
}
```
其中,`my_function()`为动态库中定义的函数。
4. 在编译时,需要使用`-l`选项指定静态库的名称,以及`-L`选项指定静态库的目录。例如,可以使用以下命令来编译调用动态库的源文件:
```bash
g++ -o my_program my_program.cpp -L/path/to/static_lib -lmy_dynamic_lib
```
其中,`my_program`为编译生成的可执行文件名,`my_program.cpp`为源文件名,`-L/path/to/static_lib`指定静态库的目录,`-lmy_dynamic_lib`指定链接的动态库名。
通过以上步骤,就可以在CMake中实现动态库调用静态库。
### 回答3:
在CMake中,动态库可以通过以下步骤调用静态库:
1. 通过`add_library`命令将静态库添加到你的项目中。例如,假设你有一个名为`my_lib`的静态库,可以使用如下命令将其添加到CMakeLists.txt文件中:
```cmake
add_library(my_lib STATIC path/to/my_lib.cpp)
```
这将在构建过程中生成名为`my_lib`的静态库。
2. 通过`target_link_libraries`命令将动态库与静态库链接。假设你有一个名为`my_app`的动态库,你可以使用如下命令将其与静态库链接:
```cmake
target_link_libraries(my_app my_lib)
```
这将使得`my_app`在运行时能够调用`my_lib`中定义的函数和变量。
完整示例:
假设你的项目目录结构如下:
```shell
.
├── CMakeLists.txt
├── main.cpp
└── my_lib
├── my_lib.cpp
└── my_lib.h
```
CMakeLists.txt文件应如下所示:
```cmake
cmake_minimum_required(VERSION 3.0)
project(MyApp)
# 添加静态库
add_library(my_lib STATIC my_lib/my_lib.cpp)
# 添加动态库并链接静态库
add_executable(my_app main.cpp)
target_link_libraries(my_app my_lib)
```
main.cpp文件只需包含`my_lib.h`头文件,并使用`my_lib`中定义的函数和变量即可。
当你构建`my_app`时,CMake会先构建`my_lib`静态库,然后链接到`my_app`中。这样,在运行`my_app`时,就可以成功调用`my_lib`中定义的函数和变量。
Cmake 怎么设置生成动态库 还是静态库
在CMake中,你可以使用add_library命令来设置生成动态库或静态库。add_library命令用于创建一个新的库目标,并指定库的类型。
要生成动态库,可以将add_library命令的第一个参数设置为库的名称,然后将第二个参数设置为SHARED。例如:
```cmake
add_library(mylib SHARED source1.cpp source2.cpp)
```
上面的例子中,我们创建了一个名为mylib的动态库目标,并将源文件source1.cpp和source2.cpp添加到该目标中。生成的动态库文件将具有与平台相关的扩展名(如.so、.dll或.dylib)。
要生成静态库,可以将add_library命令的第一个参数设置为库的名称,然后将第二个参数设置为STATIC。例如:
```cmake
add_library(mylib STATIC source1.cpp source2.cpp)
```
上面的例子中,我们创建了一个名为mylib的静态库目标,并将源文件source1.cpp和source2.cpp添加到该目标中。生成的静态库文件将具有与平台相关的扩展名(如.a、.lib或.a)。
默认情况下,CMake将根据操作系统和构建配置(如Release或Debug)来决定使用动态库还是静态库。但你也可以使用set_target_properties命令来显式地指定目标生成的库类型。例如:
```cmake
set_target_properties(mylib PROPERTIES LINKER_LANGUAGE CXX)
```
上面的例子中,我们将目标mylib的链接器语言设置为C++,这将影响生成的库的类型。
总之,通过在add_library命令中使用SHARED或STATIC作为第二个参数,可以设置生成动态库或静态库。你也可以使用set_target_properties命令来显式指定库的类型。
阅读全文