Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果链接了某些库,是否可能只包含标题?_C_Linker_Include_Static Linking_Dynamic Linking - Fatal编程技术网

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

C 如果链接了某些库,是否可能只包含标题?,c,linker,include,static-linking,dynamic-linking,C,Linker,Include,Static Linking,Dynamic Linking,我在一个项目中使用了一个经过修改的回溯\u符号的替代品(在这里找到:) 此替换取决于libbfd、libiberty和libdl。是否有任何方法可以检测到这三个库中的任何一个已链接,并且仅在这种情况下包含此库的标题?否则,我只想使用execinfo.h中的内置回溯符号 如果这看起来本身是可撤销的,那么在编译时是否可以检测这些库是否可用,以及它们是否将它们组合到我正在使用它们的对象文件中?否则,我可以在编译时用-D传入define宏,以了解它们是否可用 以下是使用修改后的回溯\u符号的对象文件的生

我在一个项目中使用了一个经过修改的
回溯\u符号的替代品(在这里找到:)

此替换取决于
libbfd
libiberty
libdl
。是否有任何方法可以检测到这三个库中的任何一个已链接,并且仅在这种情况下包含此库的标题?否则,我只想使用
execinfo.h
中的内置回溯符号

如果这看起来本身是可撤销的,那么在编译时是否可以检测这些库是否可用,以及它们是否将它们组合到我正在使用它们的对象文件中?否则,我可以在编译时用
-D
传入define宏,以了解它们是否可用

以下是使用修改后的
回溯\u符号的对象文件的生成文件:

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
与我的记录器组合到同一个对象文件中。是否有一种方法可以在这里检测
libbfd
liberty
libdl
是否可用,以及它们是否也合并到此对象文件中?目前我正在将它们链接到最终的可执行文件中,该文件链接到此记录器对象文件中,但如果可能的话,我更愿意在这个阶段进行链接。

因此,看起来实际上不可能像我尝试的那样将静态库链接到静态库中,但是,如果库不存在,可以有条件地包括一个或多个库。以下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) )

如果没有人包括他们的标题(所以你可以检查一些宏)…啊,不,你不能。链接将在编译后完成,在那一步你不知道以后会做什么。好的,那么有没有一种方法可以在编译时检查这些库是否存在,以及它们是否与我正在使用它们的对象文件相结合?否则,我可以在编译时用
-D
传递一个define宏,以知道它们不可用。OP更新了更多细节。有点复杂,但使用它可以解决您的问题。