gpt4 book ai didi

c - 使用 CMake 编译为静态库时出现问题

转载 作者:行者123 更新时间:2023-11-30 15:40:33 33 4
gpt4 key购买 nike

我正在尝试使用 CMake 将项目编译为静态链接库。在这里,我检查 BFDIberty 是否可用,如果可用,我将修改后的 backtrace-symbols.c 编译为 >OBJECT 库,并将该对象及其依赖的 BFDIbertyDL 库静态链接到项目中。当我尝试在项目中使用生成的静态库时,我在 backtrace-symbols.c 中使用的 BFD 函数上收到错误,表示它们未定义。

如何确保 BFDIbertyDL 也静态链接到此库中,以便用户不会担心在他们的项目中链接到他们?

cmake_minimum_required(VERSION 2.8)
project(simplog)

configure_file (
"SimpLogConfig.h.in"
"SimpLogConfig.h"
@ONLY
)

set( CMAKE_C_COMPILER "clang" )

find_library( BFD_LIBRARY bfd )
find_library( IBERTY_LIBRARY iberty )

find_path(
IBERTY_HEADER_PATH libiberty.h
PATHS
/usr/include/libiberty
/usr/local/include/libiberty.h
)

include_directories(
${IBERTY_HEADER_PATH}
${PROJECT_BINARY_DIR}
)

set( PACKAGE "SimpLog" )
set( PACKAGE_VERSION "0.0.1" )
if( BFD_LIBRARY AND IBERTY_LIBRARY )
option( BETTER_BACKTRACE "" ON )
add_library( backtrace-symbols OBJECT backtrace-symbols.c )
add_library( simplog STATIC simplog.c $<TARGET_OBJECTS:backtrace-symbols> )
target_link_libraries( simplog ${BFD_LIBRARY} ${IBERTY_LIBRARY} ${CMAKE_DL_LIBS} )
else()
option( BETTER_BACKTRACE "" OFF )
add_library( simplog STATIC simplog.c )
endif()

最佳答案

正如评论中所指出的,您不能将多个静态库合并为一个。这是因为大多数 C++ 编译器不支持此功能,因此 CMake 也无法在不破坏一半生成器的情况下支持它。

解决此问题的方法是使用 target_link_libraries 构建依赖关系层次结构。在您的情况下,它看起来像 backtrace_symbols 依赖于 ibertybfd,而 simplog 又依赖于 回溯符号。您可以像这样对这些依赖关系进行建模:

add_library( backtrace-symbols backtrace-symbols.c )
target_link_libraries( backtracesymbols ${IBERTY_LIBRARY} ${BFD_LIBRARY} )
add_library( simplog STATIC simplog.c )
target_link_libraries( simplog backtracesymbols )

现在,任何链接到 simplog 的可执行文件都会以正确的顺序自动提取所有依赖项,包括传递依赖项。另一方面,如果您想将库的二进制文件发送给其他开发人员,则不仅需要包含 simplog.a 文件,还需要包含backtracesymbolsibertybfd。如果您只想发送单个文件,则必须将 simpllog 制作为动态库。

确保您始终在层次结构中首次使用库依赖项的级别指定库依赖项!尽管链接器实际上仅在链接最终可执行文件时才需要它们,但以这种方式指定它们可确保链接器以正确的顺序拉入它们。如果不这样做可能会导致 undefined symbol 错误,就像您遇到的那样。

关于c - 使用 CMake 编译为静态库时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20961012/

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