我正在尝试使用CMake将项目编译为静态链接库。在这里,我要检查BFD和Iberty是否可用,以及是否将它们修改后的backtrace-symbols.c编译到OBJECT库中,并将该对象与BFD,和它依赖的Iberty库。当我尝试在项目中使用生成的静态库时,在DL中使用的BFD函数出现错误,提示它们未定义。如何确保backtrace-symbols.c,BFD和Iberty也静态链接到该库中,以便用户不必担心在他们的项目中与它们链接?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() (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 正如评论中指出的那样,您不能将多个静态库合并为一个。这是因为大多数C ++编译器不支持此功能,因此CMake在不中断其一半生成器的情况下也无法支持该功能。相反,解决此问题的方法是使用target_link_libraries构建依赖关系层次结构。在您的情况下,看起来backtrace_symbols取决于iberty和bfd,而simplog依次取决于backtrace-symbols。您可以像这样对那些依赖项进行建模: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的可执行文件都将以正确的顺序自动提取所有依赖项,包括传递性依赖项。另一方面,如果要将库的二进制文件运送给其他开发人员,则不仅需要包括.a的simplog文件,还需要包括backtracesymbols,iberty和bfd的文件。 。如果只想发送一个文件,则必须将simplog设为动态库。确保始终在首次使用它们的层次结构中指定库依赖项!即使链接器仅在链接最终可执行文件时才真正需要它们,以这种方式指定它们也可以确保链接器以正确的顺序将它们拉出。否则可能会导致未定义的符号错误,如您遇到的错误。 (adsbygoogle = window.adsbygoogle || []).push({}); 08-28 02:16