编译pjproject中的swig_java_pjsua2项目全过程记录

这里记录一下编译pjproject-2.9中的swig_java_pjsua2项目遇到的坑,以及解决。

什么是swig?

SWIG is an interface compiler that connects programs written in C and C++ with scripting languages such as Perl, Python, Ruby, and Tcl. It works by taking the declarations found in C/C++ header files and using them to generate the wrapper code that scripting languages need to access the underlying C/C++ code. In addition, SWIG provides a variety of customization features that let you tailor the wrapping process to suit your application.

这里的其他编程语言,包括的种类很多,看下面的中文介绍:

SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中 也包括非脚本编译语言,例如C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。SWIG还能够导出 XML或Lisp s-expressions格式的解析树。SWIG可以被自由使用,发布,修改用于商业或非商业中。

基本上支持C# Python Java这三个目前主流的语言就可以说在应用开发中近乎全能了,这是对实现C/C++编写的代码可重用贡献很大的,值得学习一下。C/C++在开发效率上比不过更上层的语言,使用难度也相对较大,但它适合“造轮子”的特性是其他语言无法企及的。以上提到的三个语言都可以利用C/C++为其制作底层的模块来调用,我曾经都开发过,但没有借助swig这个工具。

目前最新的版本是swig-4.0.0,下载地址是http://www.swig.org/download.html

Windows用户需要下载 swigwin-4.0.0 ,这是个已经编译好的可执行文件压缩包,解压后即可。

swig_java_pjsua2这个项目是编译出DLL给Java用的,就是java的jni。在Release|Window32配置下编译会提示找不到swig和javac,这时候需要把包含这两个文件的路径添加到path中去,比如我添加的是D:\swigwin-4.0.0和D:\Program Files\Java\jdk1.8.0_131\bin,具体路径需要自行修改。

还需要在项目属性页的C/C++——常规——附加包含目录里添加:D:\Program Files\Java\jdk1.8.0_131\include;D:\Program Files\Java\jdk1.8.0_131\include\win32,具体路径需要自行修改。

这样一编译出来一堆无法解析的外部符号:
2>    正在创建库 ..\src\swig\java\output\pjsua2.lib 和对象 ..\src\swig\java\output\pjsua2.exp
2>pjlib-util-i386-Win32-vc14-Release.lib(scanner.obj) : error LNK2001: 无法解析的外部符号 __imp__strncmp
2>pjlib-i386-Win32-vc14-Release.lib(string.obj) : error LNK2001: 无法解析的外部符号 __imp__strncmp
2>libsrtp-i386-Win32-vc14-Release.lib(crypto_kernel.obj) : error LNK2001: 无法解析的外部符号 __imp__strncmp
2>pjlib-i386-Win32-vc14-Release.lib(rand.obj) : error LNK2001: 无法解析的外部符号 __imp__srand
2>pjlib-i386-Win32-vc14-Release.lib(rand.obj) : error LNK2001: 无法解析的外部符号 __imp__rand
2>libsrtp-i386-Win32-vc14-Release.lib(cipher.obj) : error LNK2001: 无法解析的外部符号 __imp__rand
2>pjmedia-i386-Win32-vc14-Release.lib(audiodev.obj) : error LNK2001: 无法解析的外部符号 __imp___stricmp
2>pjmedia-i386-Win32-vc14-Release.lib(videodev.obj) : error LNK2001: 无法解析的外部符号 __imp___stricmp
2>pjmedia-i386-Win32-vc14-Release.lib(codec.obj) : error LNK2001: 无法解析的外部符号 __imp___stricmp
2>pjmedia-i386-Win32-vc14-Release.lib(vid_codec.obj) : error LNK2001: 无法解析的外部符号 __imp___stricmp
2>libspeex-i386-Win32-vc14-Release.lib(smallft.obj) : error LNK2001: 无法解析的外部符号 __imp__calloc
2>libpjproject-i386-Win32-vc14-Release.lib(bits.obj) : error LNK2001: 无法解析的外部符号 __imp__calloc
2>libpjproject-i386-Win32-vc14-Release.lib(nb_celp.obj) : error LNK2001: 无法解析的外部符号 __imp__calloc
2>libpjproject-i386-Win32-vc14-Release.lib(sb_celp.obj) : error LNK2001: 无法解析的外部符号 __imp__calloc
2>libspeex-i386-Win32-vc14-Release.lib(mdf.obj) : error LNK2001: 无法解析的外部符号 __imp__calloc
2>libspeex-i386-Win32-vc14-Release.lib(preprocess.obj) : error LNK2001: 无法解析的外部符号 __imp__calloc
2>libspeex-i386-Win32-vc14-Release.lib(fftwrap.obj) : error LNK2001: 无法解析的外部符号 __imp__calloc
2>libspeex-i386-Win32-vc14-Release.lib(filterbank.obj) : error LNK2001: 无法解析的外部符号 __imp__calloc
2>libsrtp-i386-Win32-vc14-Release.lib(srtp.obj) : error LNK2001: 无法解析的外部符号 __imp____stdio_common_vsscanf
2>libsrtp-i386-Win32-vc14-Release.lib(cipher.obj) : error LNK2001: 无法解析的外部符号 __imp__clock
2>libpjproject-i386-Win32-vc14-Release.lib(bits.obj) : error LNK2001: 无法解析的外部符号 __imp__realloc
2>..\src\swig\java\output\pjsua2.dll : fatal error LNK1120: 8 个无法解析的外部命令

解决的办法是,将属性页——C/C++——代码生成——运行库设为:多线程DLL (/MD)

将属性页——链接器——输入——忽略特定默认库中的msvcrt.lib删掉

原来项目设置希望静态链接(/MT)的,要忽略msvcrt.lib,但是编译却不能成功;现在改成动态链接的了,就不需要忽略这个库了。

最后编译成功。

2>------ 已启动生成: 项目: swig_java_pjsua2, 配置: Release Win32 ------
2>  Performing Custom Build Tools
2>  **************************************************************
2>   - Make sure 'swig' and 'javac' locations are in your PATH environment vars.
2>   - Make sure Java SDK header file directories
2>     (e.g: C:\Program Files (x86)\Java\jdk1.7.0_79\include and C:\Program Files (x86)\Java\jdk1.7.0_79\include\win32)
2>     are in your MSVC header search path
2>  **************************************************************
2>  Building pjsua2.dll to ..\src\swig\java\output\
2>  子目录或文件 ..\src\swig\java\output\org\pjsip\pjsua2 已经存在。
2>  Building sample app
2>  **************************************************************
2>   After the build completed succesfully, try to run the test app, e.g:
2>   java -cp D:\projects\pjproject\pjsip-apps\src\swig\java\output -Djava.library.path="D:\projects\pjproject\pjsip-apps\src\swig\java\output" org.pjsip.pjsua2.app.sample
2>  **************************************************************
2>  pjsua2_wrap.cpp
2>    正在创建库 ..\src\swig\java\output\pjsua2.lib 和对象 ..\src\swig\java\output\pjsua2.exp
2>  正在生成代码
2>  0 of 5920 functions ( 0.0%) were compiled, the rest were copied from previous compilation.
2>    0 functions were new in current compilation
2>    0 functions had inline decision re-evaluated but remain unchanged
2>  已完成代码的生成
2>  swig_java_pjsua2.vcxproj -> E:\sip\pjproject-2.8\pjsip-apps\build\..\src\swig\java\output\pjsua2.dll
2>  swig_java_pjsua2.vcxproj -> ..\src\swig\java\output\pjsua2.pdb (Full PDB)

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值