c++ - 如何使用 CMake 生成链接到静态库的 DLL
问题描述
这个问题的主要目标是编写一个CMakeLists.txt
生成动态库,“包含/链接”一个静态库。
让我创建场景:
- 我的 C++ 代码是用
mycode.cpp
- 在,我从(静态库)
mycode.cpp
调用一些函数libthirdparty.a
- 我想生成
libmylib.so
(共享库)被其他人动态链接 libmylib.so
必须“包含”libthirdparty.a
我编写此脚本的尝试如下:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror -m64 -fPIC ")
add_executable(myapp mycode.cpp)
target_link_libraries(myapp thirdparty)
add_library(mylib SHARED myapp)
但当然这不起作用,我需要一些帮助来正确编写它。
解决方案
现在,让我们删除myapp
并只关注您要创建的库。
也就是说,这就是你可以做的
cmake_minimum_required(VERSION 3.12)
project(AwesomeLib)
include(GenerateExportHeader)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
find_package(ThirdParty REQUIRED)
add_library(mylib SHARED mylib.cpp)
target_link_libraries(mylib PUBLIC ThirdParty)
# Note: If you library will be cross-platform, flag should be conditionally specified. Have a look at generator-expression
target_compile_options(mylib PRIVATE -Wall -Werror)
generate_export_header(mylib)
# TODO:
# * add install rules
# * generate config-file package
# * add tests
笔记:
generate_export_header
将生成带有 MYLIB_EXPORT 宏的“mylib_export.h”标头,用于导出符号。见https://cmake.org/cmake/help/latest/module/GenerateExportHeader.html- 要了解背后的想法
find_package(ThirdParty REQUIRED)
,我建议您阅读 config-file 包。请参阅在 cmake 项目中使用第三方库的正确方法 - 了解有关生成器表达式的更多信息。见https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html
推荐阅读
- php - 如何在 python 中从 php 创建 str_shuffle
- go - 发送带有标题文本的二进制数据
- python - Psycopg2 INSERT 变量,字符串格式错误
- c# - 在 Web API 2 的自定义活页夹中使用默认 IModelBinder
- reflection - Kotlin 对对象实例的反射
- azure-cosmosdb - 中止 WaitAndRetryAsync 策略?
- python - 在解释器工作时确定下一个要执行的脚本
- angularjs - 使用计时器时角度图表不实时更新图表
- python - 散景:绘制频谱图
- python - matplotlib/hist2d 生成的绘图在屏幕和 pdf 文件上看起来不同