使用一个Makefile, 动态,静态连接libpcap

本文介绍了一种通过修改Makefile实现动态或静态链接libpcap库的方法,并提供了具体的编译指令示例。该方法允许用户根据需要选择不同的链接方式,便于调试和优化程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

调试bug时,怀疑到libpcap的静态和动态连接上,当时是改了2个版本的Makefile.
网上有资料,可以向Makefile传入参数,在一个Makefile中实现不同的编译流程。
用了半天,将这个实验做完了。
收获了一个可以动态配置的灵活的Makefile.

工程下载点

src_test_pcap_build.7z

Makefile

# ==============================================================================
# @file makefile
# ==============================================================================
# @note 
#   test case - see value from Makefile commandline or in the Makefile
#       make PCAP_LINK_TYPE=static clean
#       make PCAP_LINK_TYPE=dynamic clean

MY_MAKE_FILE_PATH_NAME = $(MAKEFILE_LIST)

# is give make file cmd PCAP_LINK_TYPE ?
IS_PARAM_VALID_PCAP_LINK_TYPE = 0

# is link to libpcap.so ?
IS_LINK_TO_LIB_PCAP_SO = 0

# is link to libpcap.a ?
IS_LINK_TO_LIB_PCAP_A = 0

PCAP_LINK_TYPE_SO = dynamic
PCAP_LINK_TYPE_A = static

ifdef PCAP_LINK_TYPE
    ifeq ($(PCAP_LINK_TYPE_SO), $(PCAP_LINK_TYPE))
        IS_PARAM_VALID_PCAP_LINK_TYPE = 1
        IS_LINK_TO_LIB_PCAP_SO = 1
    else ifeq ($(PCAP_LINK_TYPE_A), $(PCAP_LINK_TYPE))
        IS_PARAM_VALID_PCAP_LINK_TYPE = 1
        IS_LINK_TO_LIB_PCAP_A = 1
    else
        IS_PARAM_VALID_PCAP_LINK_TYPE = 0
    endif
else
    IS_PARAM_VALID_PCAP_LINK_TYPE = 0
endif

BIN = test_libpcap_link_to
LINE80 = --------------------------------------------------------------------------------
CC = g++ -std=c++98
CFLAGS = -Wall -g

INC = -I. -I./lib_pcap/include/
LIBPATH = -L./lib_pcap/lib/ -L/usr/lib/ -L/usr/local/lib/

ifeq (1, $(IS_LINK_TO_LIB_PCAP_SO))
    LIBS = -lstdc++ -lpthread -lm -fPIC -lpcap
else ifeq (1, $(IS_LINK_TO_LIB_PCAP_A))
    LIBS = ./lib_pcap/lib/libpcap.a -lstdc++ -lpthread -lm -fPIC
else
    LIBS = 
endif

DEPEND_CODE_DIR = ./empty_dir \

DEPEND_CODE_SRC = $(shell find $(DEPEND_CODE_DIR) -name '*.cpp')
DEPEND_CODE_OBJ = $(DEPEND_CODE_SRC:.cpp=.o)

ROOT_CODE_SRC = $(shell find ./ -name '*.cpp')
ROOT_CODE_OBJ = $(ROOT_CODE_SRC:.cpp=.o)

SUB_CODE_DIR = ./socket_easy
SUB_CODE_SRC = $(shell find $(SUB_CODE_DIR) -name '*.cpp')
SUB_CODE_OBJ = $(SUB_CODE_SRC:.cpp=.o)

.PHONY: help
help:
    clear
    @echo "usage:"
    @echo
    @echo "libpcap.so dynamic link to program output"
    @echo "make PCAP_LINK_TYPE=\"${PCAP_LINK_TYPE_SO}\" rebuild"
    @echo
    @echo "libpcap.a static link to program output"
    @echo "make PCAP_LINK_TYPE=\"${PCAP_LINK_TYPE_A}\" rebuild"

.PHONY: clean
clean:
    clear

    @echo
    @echo
    @echo
    @echo
    @echo
    @echo
    @echo
    @echo
    @echo
    @echo

    @echo
    @echo
    @echo
    @echo
    @echo
    @echo
    @echo
    @echo
    @echo
    @echo

    @echo
    @echo
    @echo
    @echo
    @echo

    @echo make clean
    @echo $(LINE80)

    @echo "@file $(MY_MAKE_FILE_PATH_NAME)"
    @echo "PCAP_LINK_TYPE_SO = $(PCAP_LINK_TYPE_SO)"
    @echo "PCAP_LINK_TYPE_A = $(PCAP_LINK_TYPE_A)"
    @echo "PCAP_LINK_TYPE = $(PCAP_LINK_TYPE)"
    @echo "IS_PARAM_VALID_PCAP_LINK_TYPE = $(IS_PARAM_VALID_PCAP_LINK_TYPE)"
    @echo "IS_LINK_TO_LIB_PCAP_SO = $(IS_LINK_TO_LIB_PCAP_SO)"
    @echo "IS_LINK_TO_LIB_PCAP_A = $(IS_LINK_TO_LIB_PCAP_A)"

    @echo $(LINE80)

    rm -f $(BIN) $(ROOT_CODE_OBJ) $(DEPEND_CODE_OBJ) $(SUB_CODE_OBJ)
    rm -rf /usr/lib/$(BIN)
    rm -rf ./$(BIN)

.PHONY: all
all:$(BIN)
    @echo $(LINE80)
    @echo make all
    chmod 777 $(BIN)
    find . -name $(BIN)

$(BIN) : $(ROOT_CODE_OBJ) $(DEPEND_CODE_OBJ) $(SUB_CODE_OBJ)
    $(CC) $(CFLAGS) -o $@ $^ $(SHLIBS) $(INC) $(LIBPATH) $(LIBS)

.cpp.o:
    $(CC) -c $(CFLAGS) $^ -o $@ $(INC) $(LIBPATH) $(LIBS)

.PHONY: rebuild
rebuild:
    make -f $(MY_MAKE_FILE_PATH_NAME) clean

ifeq (1, $(IS_PARAM_VALID_PCAP_LINK_TYPE))
    @echo $(LINE80)
    make -f $(MY_MAKE_FILE_PATH_NAME) all
    chmod 775 ./$(BIN)

    cp ./lib_pcap/lib/libpcap.so.1 /usr/lib/
    ldconfig
    ldd ./$(BIN)
else
    @echo $(LINE80)
    @echo "error : make file command line input error, please see help" 
    @echo "please run => make help" 
    @echo $(LINE80)
endif


测试程序-使用了libpcap接口

// @file main.cpp

// view date time
// date "+DATE: %m/%d/%y%nTIME: %H:%M:%S"

// set date time
// date -s "2018-3-13 14:25:00"

// build prj
// make PCAP_LINK_TYPE="static" rebuild
// make PCAP_LINK_TYPE="dynamic" rebuild

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>

#include <syslog.h>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>

#include "my_syslog.h"
#include "pcap.h"

#ifndef SAFE_DELETE
#define SAFE_DELETE(p) \
    if (NULL != (p)) { \
        delete (p); \
        (p) = NULL; \
    }
#endif // #ifndef SAFE_DELETE

void init();
void uninit();
int fn_test();

int main(int argc, char** argv)
{
    init();
    fn_test();
    uninit();

    MYLOG_D("THE END");
    return EXIT_SUCCESS;
}

int fn_test()
{
    pcap_if_t* alldevs = NULL;
    pcap_if_t* d = NULL;
    int inum = 0;
    int i = 0;
    pcap_t* adhandle = NULL;
    char errbuf[PCAP_ERRBUF_SIZE] = {'\0'};

    MYLOG_D(">> testcase()");
    do {
        MYLOG_D("pcap_lib_version() = %s", pcap_lib_version());

        /* Retrieve the device list */
        if (pcap_findalldevs(&alldevs, errbuf) == -1) {
            MYLOG_D("Error in pcap_findalldevs: %s", errbuf);
            break;
        }

        /* Print the list */
        for (d = alldevs; NULL != d; d = d->next) {
            MYLOG_D("%d. %s (%s)",
                ++i, 
                d->name,
                (NULL != d->description) ? d->description : "No description available");
        }

        if (0 == i) {
            MYLOG_D("No interfaces found! Make sure WinPcap is installed.");
            break;
        }

        // printf("Enter the interface number (1-%d):",i);
        // scanf("%d", &inum);
        inum = 1;

        if (inum < 1 || inum > i) {
            MYLOG_D("Interface number out of range.");
            /* Free the device list */
            pcap_freealldevs(alldevs);
            break;
        }

        /* Jump to the selected adapter */
        for (d = alldevs, i = 0; i < (inum - 1); d = d->next, i++);

        /* Open the device */
        /* Open the adapter */
        adhandle = pcap_open_live(d->name,  // name of the device
            -1,          // portion of the packet to capture. 
            // 65536 grants that the whole packet will be captured on all the MACs.
            1,              // promiscuous mode (nonzero means promiscuous)
            -1,           // read timeout
            errbuf          // error buffer
            );

        if (NULL == adhandle) {
            MYLOG_D("Unable to open the adapter. %s is not supported by WinPcap", d->name);
            break;
        }

        MYLOG_D("listening on [%s]...", d->name);

        /* start the capture */
        // pcap_loop(adhandle, 0, packet_handler, NULL);
    } while (0);

    /* At this point, we don't need any more the device list. Free it */
    if (NULL != alldevs) {
        pcap_freealldevs(alldevs);
        alldevs = NULL;
    }

    if (NULL != adhandle) {
        pcap_close(adhandle);
        adhandle = NULL;
    }

    return 0;
}

void init()
{
    int i = 0;

    ns_syslog::open_syslog("test_new");

    // 设置控制变量中的日志条件, 实际应用中, 是从配置文件读取的控制开关
    ns_syslog::g_log_condition.b_EMERG = false;
    ns_syslog::g_log_condition.b_CRIT = true;
    ns_syslog::g_log_condition.b_ALERT = true;
    ns_syslog::g_log_condition.b_ERR = true;
    ns_syslog::g_log_condition.b_WARNING = true;
    ns_syslog::g_log_condition.b_NOTICE = true;
    ns_syslog::g_log_condition.b_INFO = true;
    ns_syslog::g_log_condition.b_DEBUG = true;

    // 根据控制变量, 设置日志的mask
    // 在实际应用中, 这里可以是动态设置, e.g. 配置文件检测线程发现配置变了, 需要变更某些级别的日志记录结果
    ns_syslog::set_log_level(
        ns_syslog::g_log_condition.b_EMERG, 
        ns_syslog::g_log_condition.b_ALERT,
        ns_syslog::g_log_condition.b_CRIT,
        ns_syslog::g_log_condition.b_ERR,
        ns_syslog::g_log_condition.b_WARNING,
        ns_syslog::g_log_condition.b_NOTICE,
        ns_syslog::g_log_condition.b_INFO,
        ns_syslog::g_log_condition.b_DEBUG);

    // clear screen (print 25 empty line)
    for (i = 0; i < 25; i++) {
        MYLOG_D("");
    }
}

void uninit()
{
    ns_syslog::close_syslog();
}

/** run result
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.56 : fn_test()] : >> testcase()
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.58 : fn_test()] : pcap_lib_version() = libpcap version 1.8.1
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.71 : fn_test()] : 1. eth0 (No description available)
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.71 : fn_test()] : 2. any (Pseudo-device that captures on all interfaces)
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.71 : fn_test()] : 3. lo (No description available)
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.71 : fn_test()] : 4. nflog (Linux netfilter log (NFLOG) interface)
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.71 : fn_test()] : 5. nfqueue (Linux netfilter queue (NFQUEUE) interface)
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.71 : fn_test()] : 6. usbmon1 (USB bus number 1)
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.71 : fn_test()] : 7. usbmon2 (USB bus number 2)
Feb 20 16:57:34 debian750devmin kernel: [714254.278799] device eth0 entered promiscuous mode
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.108 : fn_test()] : listening on [eth0]...
Feb 20 16:57:34 debian750devmin test_new[28878]: [DEBUG : main.cpp.43 : main()] : THE END
Feb 20 16:57:34 debian750devmin kernel: [714254.281525] device eth0 left promiscuous mode
*/

辅助文件-日志

// @file my_syslog.h
// @brief syslog日志宏的定义

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <syslog.h>
#include <unistd.h>
#include <sys/types.h>

namespace ns_syslog {

typedef struct _tag_log_condition {
    bool b_EMERG;
    bool b_ALERT;
    bool b_CRIT;
    bool b_ERR;

    bool b_WARNING;
    bool b_NOTICE;
    bool b_INFO;
    bool b_DEBUG;

    _tag_log_condition() {
        b_EMERG = false;
        b_ALERT = false;
        b_CRIT = false;
        b_ERR = false;

        b_WARNING = false;
        b_NOTICE = false;
        b_INFO = false;
        b_DEBUG = false;
    }
} TAG_LOG_CONDITION;

extern TAG_LOG_CONDITION g_log_condition;

// ----------------------------------------------------------------------------
// syslog macro
// ----------------------------------------------------------------------------

#define MYLOG_EMERG(fmt, ...) \
if (ns_syslog::g_log_condition.b_EMERG) { \
syslog(LOG_EMERG, "[%s : %s.%d : %s()] : " fmt, "EMERG", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

#define MYLOG_EM(fmt, ...) \
if (ns_syslog::g_log_condition.b_EMERG) { \
syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "EMERG", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

// ----------------------------------------------------------------------------

#define MYLOG_ALERT(fmt, ...) \
if (ns_syslog::g_log_condition.b_ALERT) { \
syslog(LOG_ALERT, "[%s : %s.%d : %s()] : " fmt, "ALERT", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

#define MYLOG_A(fmt, ...) \
if (ns_syslog::g_log_condition.b_ALERT) { \
syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "ALERT", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

// ----------------------------------------------------------------------------

#define MYLOG_CRIT(fmt, ...) \
if (ns_syslog::g_log_condition.b_CRIT) { \
syslog(LOG_CRIT, "[%s : %s.%d : %s()] : " fmt, "CRIT", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

#define MYLOG_C(fmt, ...) \
if (ns_syslog::g_log_condition.b_CRIT) { \
syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "CRIT", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

// ----------------------------------------------------------------------------

#define MYLOG_ERR(fmt, ...) \
if (ns_syslog::g_log_condition.b_ERR) { \
syslog(LOG_ERR, "[%s : %s.%d : %s()] : " fmt, "ERR", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

#define MYLOG_E(fmt, ...) \
if (ns_syslog::g_log_condition.b_ERR) { \
syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "ERR", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

// ----------------------------------------------------------------------------

#define MYLOG_WARNING(fmt, ...) \
if (ns_syslog::g_log_condition.b_WARNING) { \
syslog(LOG_WARNING, "[%s : %s.%d : %s()] : " fmt, "WARNING", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

#define MYLOG_W(fmt, ...) \
if (ns_syslog::g_log_condition.b_WARNING) { \
syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "WARNING", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

// ----------------------------------------------------------------------------

#define MYLOG_NOTICE(fmt, ...) \
if (ns_syslog::g_log_condition.b_NOTICE) { \
syslog(LOG_NOTICE, "[%s : %s.%d : %s()] : " fmt, "NOTICE", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

#define MYLOG_N(fmt, ...) \
if (ns_syslog::g_log_condition.b_NOTICE) { \
syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "NOTICE", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

// ----------------------------------------------------------------------------

#define MYLOG_INFO(fmt, ...) \
if (ns_syslog::g_log_condition.b_INFO) { \
syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "INFO", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

#define MYLOG_I(fmt, ...) \
if (ns_syslog::g_log_condition.b_INFO) { \
syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "INFO", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

// ----------------------------------------------------------------------------

#define MYLOG_DEBUG(fmt, ...) \
if (ns_syslog::g_log_condition.b_DEBUG) { \
syslog(LOG_DEBUG, "[%s : %s.%d : %s()] : " fmt, "DEBUG", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

#define MYLOG_D(fmt, ...) \
if (ns_syslog::g_log_condition.b_DEBUG) { \
syslog(LOG_INFO, "[%s : %s.%d : %s()] : " fmt, "DEBUG", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
}

// ----------------------------------------------------------------------------

void open_syslog(const char* pszLogOwner);
void set_log_level(
    bool b_EMERG = false,
    bool b_CRIT = false,
    bool b_ALERT = false,
    bool b_ERR = false,
    bool b_WARNING = false,
    bool b_NOTICE = false,
    bool b_INFO = false,
    bool b_DEBUG = false);
void close_syslog();

} // namespace ns_syslog {

// @file my_syslog.cpp
// @brief syslog日志宏的实现

#include "my_syslog.h"

namespace ns_syslog {

TAG_LOG_CONDITION g_log_condition;

void open_syslog(const char* pszLogOwner)
{
    openlog(((NULL != pszLogOwner) ? pszLogOwner : "my_syslog"), LOG_NOWAIT | LOG_PID, LOG_LOCAL1);
}

void set_log_level(
    bool b_EMERG,
    bool b_CRIT,
    bool b_ALERT,
    bool b_ERR,
    bool b_WARNING,
    bool b_NOTICE,
    bool b_INFO,
    bool b_DEBUG)
{
    int i_mask = 0;

    if (b_EMERG) {
        // LOG_EMERG 日志会阻塞控制台程序, 必须要使这个条件为false, 不能执行这里
        // LOG_EMERG 不仅是记录到日志, 还打印到正在运行的程序上, 阻塞了程序的执行. 不能用这种日志
        i_mask |= LOG_MASK(LOG_EMERG);    
    }

    if (b_ALERT) {
        i_mask |= LOG_MASK(LOG_ALERT);
    }

    if (b_CRIT) {
        i_mask |= LOG_MASK(LOG_CRIT);
    }

    if (b_ERR) {
        i_mask |= LOG_MASK(LOG_ERR);
    }

    if (b_WARNING) {
        i_mask |= LOG_MASK(LOG_WARNING);
    }

    if (b_NOTICE) {
        i_mask |= LOG_MASK(LOG_NOTICE);
    }

    if (b_INFO) {
        i_mask |= LOG_MASK(LOG_INFO);
    }

    if (b_DEBUG) {
        i_mask |= LOG_MASK(LOG_DEBUG);
    }

    setlogmask(i_mask);
}

void close_syslog()
{
    closelog();
}

} // namespace ns_syslog {

编译和运行过程

// @file readme.txt

// --------------------------------------------------------------------------------
make help
// --------------------------------------------------------------------------------

usage:

libpcap.so dynamic link to program output
make PCAP_LINK_TYPE="dynamic" rebuild

libpcap.a static link to program output
make PCAP_LINK_TYPE="static" rebuild


// --------------------------------------------------------------------------------
make PCAP_LINK_TYPE="dynamic" rebuild
// --------------------------------------------------------------------------------
make clean
--------------------------------------------------------------------------------
@file  Makefile
PCAP_LINK_TYPE_SO = dynamic
PCAP_LINK_TYPE_A = static
PCAP_LINK_TYPE = dynamic
IS_PARAM_VALID_PCAP_LINK_TYPE = 1
IS_LINK_TO_LIB_PCAP_SO = 1
IS_LINK_TO_LIB_PCAP_A = 0
--------------------------------------------------------------------------------
rm -f test_libpcap_link_to ./my_syslog.o ./main.o  
rm -rf /usr/lib/test_libpcap_link_to
rm -rf ./test_libpcap_link_to
make[1]: Leaving directory `/home/dev'
--------------------------------------------------------------------------------
make -f  Makefile all
find: “./empty_dir”: 没有那个文件或目录
find: “./socket_easy”: 没有那个文件或目录
make[1]: Entering directory `/home/dev'
g++ -std=c++98 -c -Wall -g my_syslog.cpp -o my_syslog.o -I. -I./lib_pcap/include/ -L./lib_pcap/lib/ -L/usr/lib/ -L/usr
/local/lib/ -lstdc++ -lpthread -lm -fPIC -lpcap

g++ -std=c++98 -c -Wall -g main.cpp -o main.o -I. -I./lib_pcap/include/ -L./lib_pcap/lib/ -L/usr/lib/ -L/usr/local/lib
/ -lstdc++ -lpthread -lm -fPIC -lpcap

g++ -std=c++98 -Wall -g -o test_libpcap_link_to my_syslog.o main.o  -I. -I./lib_pcap/include/ -L./lib_pcap/lib/ -L/usr
/lib/ -L/usr/local/lib/ -lstdc++ -lpthread -lm -fPIC -lpcap

--------------------------------------------------------------------------------
make all
chmod 777 test_libpcap_link_to
find . -name test_libpcap_link_to
./test_libpcap_link_to
make[1]: Leaving directory `/home/dev'
chmod 775 ./test_libpcap_link_to
cp ./lib_pcap/lib/libpcap.so.1 /usr/lib/
ldconfig
ldd ./test_libpcap_link_to
    linux-vdso.so.1 =>  (0x00007fff9e9ff000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00002b175fe61000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00002b1760168000)
    libpcap.so.1 => /usr/lib/libpcap.so.1 (0x00002b1760385000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00002b17605c4000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00002b1760846000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00002b1760a5d000)
    /lib64/ld-linux-x86-64.so.2 (0x00002b175fc3f000)


// --------------------------------------------------------------------------------
make PCAP_LINK_TYPE="static" rebuild
// --------------------------------------------------------------------------------
make clean
--------------------------------------------------------------------------------
@file  Makefile
PCAP_LINK_TYPE_SO = dynamic
PCAP_LINK_TYPE_A = static
PCAP_LINK_TYPE = static
IS_PARAM_VALID_PCAP_LINK_TYPE = 1
IS_LINK_TO_LIB_PCAP_SO = 0
IS_LINK_TO_LIB_PCAP_A = 1
--------------------------------------------------------------------------------
rm -f test_libpcap_link_to ./my_syslog.o ./main.o  
rm -rf /usr/lib/test_libpcap_link_to
rm -rf ./test_libpcap_link_to
make[1]: Leaving directory `/home/dev'
--------------------------------------------------------------------------------
make -f  Makefile all
find: “./empty_dir”: 没有那个文件或目录
find: “./socket_easy”: 没有那个文件或目录
make[1]: Entering directory `/home/dev'
g++ -std=c++98 -c -Wall -g my_syslog.cpp -o my_syslog.o -I. -I./lib_pcap/include/ -L./lib_pcap/lib/ -L/usr/lib/ -L/usr
/local/lib/ ./lib_pcap/lib/libpcap.a -lstdc++ -lpthread -lm -fPIC

g++: warning: ./lib_pcap/lib/libpcap.a: linker input file unused because linking not done
g++ -std=c++98 -c -Wall -g main.cpp -o main.o -I. -I./lib_pcap/include/ -L./lib_pcap/lib/ -L/usr/lib/ -L/usr/local/lib
/ ./lib_pcap/lib/libpcap.a -lstdc++ -lpthread -lm -fPIC

g++: warning: ./lib_pcap/lib/libpcap.a: linker input file unused because linking not done
g++ -std=c++98 -Wall -g -o test_libpcap_link_to my_syslog.o main.o  -I. -I./lib_pcap/include/ -L./lib_pcap/lib/ -L/usr
/lib/ -L/usr/local/lib/ ./lib_pcap/lib/libpcap.a -lstdc++ -lpthread -lm -fPIC

--------------------------------------------------------------------------------
make all
chmod 777 test_libpcap_link_to
find . -name test_libpcap_link_to
./test_libpcap_link_to
make[1]: Leaving directory `/home/dev'
chmod 775 ./test_libpcap_link_to
cp ./lib_pcap/lib/libpcap.so.1 /usr/lib/
ldconfig
ldd ./test_libpcap_link_to
    linux-vdso.so.1 =>  (0x00007fff354b1000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00002b38e63bb000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00002b38e66c2000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00002b38e68df000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00002b38e6b61000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00002b38e6d77000)
    /lib64/ld-linux-x86-64.so.2 (0x00002b38e6199000)

// --------------------------------------------------------------------------------
// run result
// --------------------------------------------------------------------------------

Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.56 : fn_test()] : >> testcase()
Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.58 : fn_test()] : pcap_lib_version() = libpcap 
version 1.8.1

Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.71 : fn_test()] : 1. eth0 (No description available)
Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.71 : fn_test()] : 2. any (Pseudo-device that 
captures on all interfaces)

Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.71 : fn_test()] : 3. lo (No description available)
Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.71 : fn_test()] : 4. nflog (Linux netfilter log (
NFLOG) interface)

Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.71 : fn_test()] : 5. nfqueue (Linux netfilter queue 
(NFQUEUE) interface)

Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.71 : fn_test()] : 6. usbmon1 (USB bus number 1)
Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.71 : fn_test()] : 7. usbmon2 (USB bus number 2)
Mar 24 15:39:17 debian750devmin kernel: [ 7574.262626] device eth0 entered promiscuous mode
Mar 24 15:39:17 debian750devmin test_new[7923]: [DEBUG : main.cpp.108 : fn_test()] : listening on [eth0]...
Mar 24 15:39:17 debian750devmin test_libpcap_link_to[7923]: [DEBUG : main.cpp.43 : main()] : THE END
Mar 24 15:39:17 debian750devmin kernel: [ 7574.264846] device eth0 left promiscuous mode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值