这个问题的主要目标是编写一个 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” header 。参见 https://cmake.org/cmake/help/latest/module/GenerateExportHeader.html- 要了解
find_package(ThirdParty REQUIRED)
背后的想法,我建议您阅读配置文件包。参见 Correct way to use third-party libraries in cmake project - 了解有关生成器表达式的更多信息。参见 https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html
关于c++ - 如何使用 CMake 生成链接到静态库的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51773821/