如果链接某些库,可能只包含标题?

时间:2014-01-04 20:42:40

标签: c linker include static-linking dynamic-linking

我在项目中使用backtrace_symbols的修改替代品(在此处找到:http://cairo.sourcearchive.com/documentation/1.9.4/backtrace-symbols_8c-source.html

此替换取决于libbfdlibibertylibdl。有没有什么方法可以检测到这三个库已被链接,如果是这种情况,只包含此标题?否则我只想回到execinfo.h内置的backtrace_symbols。

如果它本身似乎是可撤消的,是否可以在编译时检测这些库是否可用,如果它们将它们组合到我正在使用它们的目标文件中?否则,我可以在编译时传入一个带-D的定义宏,以了解它们是否可用。

以下是使用修改后的backtrace_symbols

的目标文件的makefile
CC = clang
CFLAGS = -g -Wall -c
SOURCE = simplog.c
OBJ = simplog.o simplog-temp.o backtrace-symbols.o

all:
    $(CC) $(CFLAGS) $(SOURCE); mv simplog.o simplog-temp.o; \
    $(CC) -ansi $(CFLAGS) backtrace-symbols.c; \
    ld -r simplog-temp.o backtrace-symbols.o -o simplog.o

clean:
    rm -f $(OBJ) 

正如您所看到的,我将backtrace-symbols.c与我的记录器合并到同一个目标文件中。如果libbfdlibertylibdl可用,我是否可以在此处检测到这种方式,以及它们是否也将它们合并到此目标文件中?目前我将它们链接到链接在此记录器对象文件中的最终可执行文件,但如果可能的话,我更愿意在此阶段执行此操作。

1 个答案:

答案 0 :(得分:0)

所以看起来实际上不可能像我想要的那样将静态库链接到静态库中,但是如果它们不存在则可以有条件地包含库/库。以下CMakeLists代码显示了检查是否存在某些必需库以及是否将它们包含在最终库中的基本方法,并在代码中提供#define以了解它们是否可用:

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 STATIC backtrace-symbols.c )
    target_link_libraries( backtrace-symbols ${BFD_LIBRARY} ${IBERTY_LIBRARY} ${CMAKE_DL_LIBS} )
    set( LIBS $(LIBS) backtrace-symbols )
else()
    option( BETTER_BACKTRACE "" OFF )
    set( LIBS $(LIBS) "" )
endif()

add_library( simplog STATIC simplog.c )
target_link_libraries( simplog $(LIBS) )