c++ - 如何使用 CMake 生成链接到静态库的 DLL

标签 c++ dll cmake

这个问题的主要目标是编写一个 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

注意事项:

关于c++ - 如何使用 CMake 生成链接到静态库的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773821/

相关文章:

c++ - 为什么 GetProcAddress() 不起作用?

sql-server - 在哪里可以找到 sqljdbc_xa.dll 文件?

c++ - 如何使使用 AUTOUIC 添加的包含目录可用于下游目标?

CMake 创建了很多我没有指定的目标

c++ - 将指针解释为二维数组

c++ - 使用右值 initializer_list 进行类型推断

.net - 如何找到特定 dll 的 PublicKeyToken?

cmake - 在 cmake 中有选择地运行 doxygen

C++ 使用 CRTP 检测 friend 类的私有(private)成员

c++ - 根据另一个可变参数包查找可变参数包的收缩