gpt4 book ai didi

CMake:如何从子项目的所有静态库创建单个共享库?

转载 作者:行者123 更新时间:2023-12-02 13:44:09 26 4
gpt4 key购买 nike

我有以下布局:

top_project
+ subproject1
+ subproject2

subproject1subproject2 均创建一个静态库。我想将这些静态库链接到 top_project 级别的单个共享库中。

到目前为止我收集到的信息是:

  • 使用 -fPic 进行编译(除了 Windows 之外的所有系统都需要),以创建位置无关的代码,该代码将允许将静态库链接到单个共享库或解压缩所有静态库(例如使用ar )并将它们重新链接到共享库(我认为这是一个不优雅且不可移植的解决方案)
  • 所有源文件都必须显式地提供给 add_library 命令:出于某种我无法理解的原因,只需编写 add_library(${PROJECT_NAME} SHARED subproject1 subproject2) 即可无法按预期工作(它本质上创建了一个空库并且没有正确注册依赖项)
  • CMake 中有一个 OBJECT 库功能,但我认为它的目的并不是真正做我想做的事。

有什么想法吗?

最佳答案

好吧,我明白了:这比应有的痛苦得多。直到最近,Kitware 的人们还不明白为什么有人想要从静态库创建 DLL。他们的论点是,主目录中应该始终有源文件(例如,在我的例子中为 top_project),因为它实际上是一个自己的项目。我对事物的看法不同&我需要打破top_project分成不应该独立存在的较小的子项目(即,为它们创建一个完整的项目并使用 ExternalProject_Add 添加它们是没有意义的)。此外,当我发布我的共享库(用于使用,例如与 Java native 接口(interface)一起使用)时,我不想发布数十个共享库,因为这相当于暴露了我的项目的内部布局。不管怎样,在我认为已经从静态库创建共享库的案例中,我将继续讨论技术细节。

subproject1 的 CMakeLists.txt 中和subproject2 ,您应该使用 OBJECT 库功能(在 CMake 2.8.8 中引入)创建目标:

add_library(${PROJECT_NAME} OBJECT ${SRC})

哪里SRC指定源文件列表(请注意,这些应该在 CMakeLists.txt 文件中显式设置,因为它允许 make 在检测到 CMakeLists.txt 的修改时重新启动 CMake,例如添加或删除文件时)

top_project ,使用以下命令添加子项目:

add_subdirectory(subproject1)
add_subdirectory(subproject2)

为了查看静态库中的符号,请使用:

set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--export-all-symbols")

然后您可以使用以下方法创建共享库:

add_library(${PROJECT_NAME} SHARED $<TARGET_OBJECTS:subproject1>
$<TARGET_OBJECTS:subproject2>)

我发现任何“普通”库(即不是对象)都需要添加到单独的 add_library 中命令,否则它会被忽略。

对于可执行文件,您可以使用:

add_executable(name_of_executable $<TARGET_OBJECTS:subproject1>
$<TARGET_OBJECTS:subproject2>)
set(LINK_FLAGS ${LINK_FLAGS} "-Wl,-whole-archive")
target_link_libraries(name_of_executable ${PROJECT_NAME}

我再说一遍,这只适用于 CMake 2.8.8 版本。 CMake 非常好地管理依赖关系并且是跨平台的,因为它并不比普通的旧 Makefile 少多少痛苦,而且灵 active 肯定较差。

关于CMake:如何从子项目的所有静态库创建单个共享库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11429055/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com