c - 包括PJSIP-Library并编写makefile

标签 c makefile include-path pjsip

我是编写 makefile 的新手。现在我尝试使用 pjsip c-library,它安装在我的主目录中。我剪了一点并尝试编译它。有一些错误,所以我寻找解决方案,所以我发现我必须将该库包含到搜索路径中。此外,可以在 makefile 中声明它们,所以我尝试了第二个解决方案。

这是我的 makefile:

pjpath=home/pi/pjproject-2.4.5
LIB=-L/$(pjpath)/pjlib/lib -L/$(pjpath)/pjlib-util/lib -L/$(pjpath)/pjnath/lib -L/$(pjpath)/pjmedia/lib -L/$(pjpath)/pjsip/lib
INC=-I/$(pjpath)/pjlib/include -I/$(pjpath)/pjlib-util/include -I/$(pjpath)/pjnath/include -I/$(pjpath)/pjmedia/include -I/$(pjpath)/pjsip/include

all:
        gcc -o test $(INC) simple_pjsua.c $(LIB) -lpj -lpjlib -lpjnath -lpjmedia -lpjmedia-audiodev -lpjmedia-codec -lpjmedia-videodev -lpjsdp -lpjsip -lpjsip-simple -lpjsip-ua -lpjsua -lpjsua2
clean: 
        rm simple_pjsua.o test

这是我的 c 文件 simple_pjsua.c:

#define PJ_IS_LITTLE_ENDIAN 1
#define PJ_IS_BIG_ENDIAN 0 
#include <pjsua-lib/pjsua.h>
#define THIS_FILE "App"
#define SIP_USER "demo-user2"
#define SIP_DOMAIN "sip:192.168.2.59"
#define SIP_PASSWD "123456"
    static void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata);
    static void on_call_state(pjsua_call_id call_id, pjsip_event *e);
    static void on_call_media_state(pjsua_call_id call_id);
    static void error_exit(const char *title, pj_status_t status);

    int main(int argc, char *argv[]){
            printf("Hello World");
            return 0;
    }

    static void on_incoming_call(pjsua_acc_id acc_id, pjsua_call_id call_id, pjsip_rx_data *rdata){
            pjsua_call_info ci; 
            PJ_UNUSED_ARG(acc_id);
            PJ_UNUSED_ARG(rdata);
            pjsua_call_get_info(call_id, &ci);

            PJ_LOG(3,(THIS_FILE, "Incoming call from %.*s!!", (int) ci.remote_info.slen, ci.remote_info.ptr));

            /* Automatically answer incoming calls with 200/OK */
            pjsua_call_answer(call_id, 200, NULL, NULL);
    }

    static void on_call_state(pjsua_call_id call_id, pjsip_event *e){
            pjsua_call_info ci; 

            PJ_UNUSED_ARG(e);

            pjsua_call_get_info(call_id, &ci);
            PJ_LOG(3,(THIS_FILE, "Call %d state=%.*s", call_id, (int) ci.state_text.slen, ci.state_text.ptr));
    }

    static void on_call_media_state(pjsua_call_id call_id){
            pjsua_call_info ci; 
            pjsua_call_get_info(call_id, &ci);

            if (ci.media_status == PJSUA_CALL_MEDIA_ACTIVE) {
                    pjsua_conf_connect(ci.conf_slot, 0); 
                    pjsua_conf_connect(0, ci.conf_slot);
            }   
    }

    static void error_exit(const char *title, pj_status_t status){
            pjsua_perror(THIS_FILE, title, status);
            pjsua_destroy();
            exit(1);
    }

这是我的 makefile 输出:

    gcc -o test -I/home/pi/pjproject-2.4.5/pjlib/include -I/home/pi/pjproject-2.4.5/pjlib-util/include -I/home/pi/pjproject-2.4.5/pjnath/include -I/home/pi/pjproject-2.4.5/pjmedia/include -I/home/pi/pjproject-2.4.5/pjsip/include simple_pjsua.c -L/home/pi/pjproject-2.4.5/pjlib/lib -L/home/pi/pjproject-2.4.5/pjlib-util/lib -L/home/pi/pjproject-2.4.5/pjnath/lib -L/home/pi/pjproject-2.4.5/pjmedia/lib -L/home/pi/pjproject-2.4.5/pjsip/lib -lpj -lpjlib -lpjnath -lpjmedia -lpjmedia-audiodev -lpjmedia-codec -lpjmedia-videodev -lpjsdp -lpjsip -lpjsip-simple -lpjsip-ua -lpjsua -lpjsua2 
In file included from /home/pi/pjproject-2.4.5/pjlib/include/pj/config.h:288:0,
                 from /home/pi/pjproject-2.4.5/pjlib/include/pj/types.h:33,
                 from /home/pi/pjproject-2.4.5/pjsip/include/pjsip/sip_config.h:27,
                 from /home/pi/pjproject-2.4.5/pjsip/include/pjsip/sip_types.h:34,
                 from /home/pi/pjproject-2.4.5/pjsip/include/pjsip.h:24,
                 from /home/pi/pjproject-2.4.5/pjsip/include/pjsua-lib/pjsua.h:30,
                 from simple_pjsua.c:3:
/home/pi/pjproject-2.4.5/pjlib/include/pj/config_site.h:3:35: warning: extra tokens at end of #include directive [enabled by default]
/usr/bin/ld: cannot find -lpj
/usr/bin/ld: cannot find -lpjlib
/usr/bin/ld: cannot find -lpjnath
/usr/bin/ld: cannot find -lpjmedia
/usr/bin/ld: cannot find -lpjmedia-audiodev
/usr/bin/ld: cannot find -lpjmedia-codec
/usr/bin/ld: cannot find -lpjmedia-videodev
/usr/bin/ld: cannot find -lpjsdp
/usr/bin/ld: cannot find -lpjsip
/usr/bin/ld: cannot find -lpjsip-simple
/usr/bin/ld: cannot find -lpjsip-ua
/usr/bin/ld: cannot find -lpjsua
/usr/bin/ld: cannot find -lpjsua2
collect2: ld returned 1 exit status
makefile:6: recipe for target 'all' failed
make: *** [all] Error 1

我还发现了一个有用的 site ,它解释了它是如何完成的,尽管我还无法弄清楚。

最佳答案

首先,第一个警告来自库代码,你的代码没有罪。

然后,始终在所有源文件或目标文件之后指定链接库。默认情况下,GNU 链接器不会记住尚未引用的库中的符号,因此如果 somelib 还没有,它只会删除所有 -lsomelib已被先前的对象或库引用。

所以,我敢打赌,这条线

 gcc -o test $(INC) simple_pjsua.c $(LIB)

会对您有所帮助(或者至少可以解决此特定错误)。

关于c - 包括PJSIP-Library并编写makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33808791/

相关文章:

c - 释放 CUDA 内存非常缓慢

arrays - 在C中交换2个数组

c++ - 对标志在 makefile 中的工作方式感到困惑

linux - 当我使用 Makefile 构建简单内核时出现 '__aeabi_STH' 错误

clang - clang 的包含优先级是怎么回事?

c - 将 ruby​​ 数组值传递到 C 数组

c - strcpy "address pointing at code space is taken"出现错误

c++ - 使用 cmake/mingw 输出 DLL 而不是 .exe

image - vim 图像放置

c++ - 如何使用带路径的包含文件在 Visual Studio 中构建?