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更新了更多细节。有点复杂,但使用它可以解决您的问题。