精华内容
下载资源
问答
  • 链接库:libsnlp_client.a 时提示大量未定义符号或引用: /home/work/wlh01/searchsuggest/git-suggest/suggest/scf/snlp_client/snlpservice_TokenizerService_ClientInterface.cpp:22: undefined reference to `...

    问题描述:
    链接库:libsnlp_client.a 时提示大量未定义符号或引用:

    /home/work/wlh01/searchsuggest/git-suggest/suggest/scf/snlp_client/snlpservice_TokenizerService_ClientInterface.cpp:22: undefined reference to `scf::ProxyStandard::ProxyStandard(std::string, char*, bool)'
    /home/work/wlh01/searchsuggest/git-suggest/suggest/scf/snlp_client/snlpservice_TokenizerService_ClientInterface.cpp:26: undefined reference to `scf::Parameter::Parameter(int, char*, void*, bool, ParaType)'
    /home/work/wlh01/searchsuggest/git-suggest/suggest/scf/snlp_client/snlpservice_TokenizerService_ClientInterface.cpp:29: undefined reference to `scf::Parameter::Parameter(int, char*, void*, bool, ParaType)'
    /home/work/wlh01/searchsuggest/git-suggest/suggest/scf/snlp_client/snlpservice_TokenizerService_ClientInterface.cpp:32: undefined reference to `null_aic'
    /home/work/wlh01/searchsuggest/git-suggest/suggest/scf/snlp_client/snlpservice_TokenizerService_ClientInterface.cpp:32: undefined reference to `scf::ProxyStandard::invoke(char*, scf::Parameter**, int, int*, AsynInvokeContext&)'
    /home/work/wlh01/searchsuggest/git-suggest/suggest/scf/snlp_client/snlpservice_TokenizerService_ClientInterface.cpp:35: undefined reference to `scf_free'
    ...
    ../../lib/libsnlp_client.a(TokenizerService_Common_ClientInterface.o): In function `registerAll()':
    /home/work/wlh01/searchsuggest/git-suggest/suggest/scf/snlp_client/./TokenizerService_Common_ScfEntity.h:9: undefined reference to `INFO_REGISTRED'
    collect2: error: ld returned 1 exit status
    make: *** [snlp_demo] 错误 1
    

    问题分析:
    make的链接选项为:

    g++  -o ../bin/demo demo.o -Wl,-dn -lclient -lprotocol -lserialize -ljsonparser -lutils -lthreadpool -ltinyxpath -lsnlp_client -Wl,-dy -llog4cxx -lpthread -lz -lpcre -lboost_system
    

    snlp_client.a依赖libprotocol.a和libclient.a,但是libsnlp_client.a在这两个库之后,先链接libprotocol.a和libclient.a时,snlp_client.a需要的符号不会被链接进来(链接静态库时的默认配置,以减小最终程序的大小)。等到链接snlp_client.a时,就会出现找不到snlp_client.a需要的符号问题了。

    解决办法:

    1. 将 -lsnlp_client 的位置挪到 -lclient 之前。
    展开全文
  • 本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。 太长不看版:请跳至文章最后的总结对比表。 一。内容包含: ①静态库libbb.a依赖静态库libaa.a的测试; ②...

    本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等。

    太长不看版:请跳至文章最后的总结对比表。

    一。内容包含:

    ①静态库libbb.a依赖静态库libaa.a的测试;

    ②静态库libbb.a依赖动态库libaa.so的测试;

    ③动态库libbb.so依赖静态库libaa.a的测试;

    ④动态库libbb.so依赖动态库libaa.so的测试;

    所用到的文件列表:

    aalib.cpp aalib.h        bblib.cpp bblib.h     main.cpp

    二。源代码:

    aalib.h

    #ifndef AALIB_H
    #define AALIB_H
    #include "stdio.h"
    void helloAA();

    #endif

    ********分割线**************

    aalib.cpp

    #include "aalib.h"

    void helloAA()
    {
        printf(" lib AAAAAAAAAAAAA\n ");
    }

    ********分割线**************

    bblib.h

    #ifndef BBLIB_H
    #define BBLIB_H

    void helloBB();
    void helloAB();

    #endif

    ********分割线**************

    bblib.cpp

    #include "bblib.h"
    #include "aalib.h"

    void helloBB()
    {
        printf(" lib BBBBBBBBBBBBBBBB \n");
    }

    void helloAB()
    {
        printf(" *a*******************\n");
        helloAA();
        helloBB();
        printf(" *b*******************\n");
    }

    ********分割线**************

    main.cpp

    #include "bblib.h"

    int main()
    {
        helloBB();

        helloAB();
    }
     

    三。测试过程

    ①静态库libbb.a依赖静态库libaa.a的测试

    现在生成了静态库libaa.a和libbb.a,下面测试静态库的使用方法:

    可以看到链接静态库的话要指定静态库依赖的静态库,否则编译不过去!由此可见轻易不要链接静态库,因为你也许不知道你要用的静态库还依赖着哪些库.......

    那么将所依赖的静态库编译进静态库呢?试试

    可以看到,使用命令ar rcs libbb.a bblib.o libaa.a并没有起到作用,亦即libaa.a并没有被编译进libbb.a,因此编译可执行程序时还需要链接libaa.a。

    改用下面这种方式编译,可行:

    即编译静态库libbb.a时不要链接libaa.a而是用aalib.o文件,亦即编译静态库链接静态库时不能直接链接静态库,而是用形成该静态库的那些.o文件,可以使用 ar -x libaa.a来获取静态库的所有.o文件(注意:所有.o文件的顺序要对,被依赖的要放后面)。

    ②静态库libbb.a依赖动态库libaa.so的测试

    第一行命令:gcc -o libaa.so -shared -fPIC aalib.cpp

    等价于:gcc -c -shared -fPIC aalib.cpp 加 gcc -o libaa.so -shared -fPIC aalib.o 这两条(注意编译.o时要加选项-shared -fPIC,否则无法生存.so)

    可以看到,编译可执行程序时只链接静态库不链接动态库编译不过去!运行时也需要动态库libaa.so支持

    那么将动态库编译进静态库中呢?试试

    可以看到,虽然编译静态库libbb.a的时候链接了动态库libaa.so,编译可执行程序只链接静态库libbb.a也能编译过去,但是在执行时还是要libaa.so动态库支持。

    ③动态库libbb.so依赖静态库libaa.a的测试

    可以看到编译libbb.so时链接静态库出错,提示静态库需要使用-fPIC选项来编译,那就按照提示的来修改编译命令:

    静态库所需的.o文件使用-shared -fPIC编译,然后在编译动态库的时候链接静态库好用了。并且编译可执行文件时不用链接被依赖的静态库。

    来看一下这个动态库libbb.so依赖哪些库:

    可以看到没有依赖libaa.a这个静态库。

    ④动态库libbb.so依赖动态库libaa.so的测试

    动态库链接动态库成功,并且编译可执行文件时也不用链接被依赖的库,但是运行时还是要两个动态库支持。

    四。总结

    被依赖的库aa 编译库aa的命令 直接库bb 编译库bb的命令 编译可执行程序的命令 编译时是否需要库aa 运行时是否需要库aa
    libaa.a

    gcc -c aalib.cpp

     ar rcs libaa.a aalib.o

    libbb.a gcc -c bblib.cpp                                ar rcs libbb.a bblib.o gcc -o out main.cpp libbb.a libaa.a 需要 不需要
    libaa.a gcc -c aalib.cpp      ar rcs libaa.a aalib.o libbb.a gcc -c bblib.cpp                               ar rcs libbb.a bblib.o aalib.o gcc -o out main.cpp libbb.a  不需要 不需要
    libaa.so gcc -o libaa.so -shared -fPIC aalib.cpp libbb.a gcc -c bblib.cpp                               ar rcs libbb.a bblib.o libaa.so gcc -o out main.cpp libbb.a 不需要 需要
    libaa.a gcc -c aalib.cpp      ar rcs libaa.a aalib.o libbb.so gcc -o libbb.so -shared -fPIC bblib.cpp libaa.a 编译libbb.so就出错,无法编译成动态库    
    libaa.a gcc -c -shared -fPIC aalib.cpp               ar rcs libaa.a aalib.o libbb.so gcc -o libbb.so -shared -fPIC bblib.cpp libaa.a gcc -o out main.cpp -L./ -lbb 不需要 不需要
    libaa.so gcc -o libaa.so -shared -fPIC aalib.cpp libbb.so gcc -o libbb.so -shared -fPIC bblib.cpp -L./ -laa gcc -o out main.cpp -L./ -lbb 不需要 需要

    其他说明:链接静态库时要注意顺序,使用第二行的方法编译直接库libbb.a的时候用到被依赖库的.o文件,注意些个.o文件的依赖顺序也很重要,不能错,被依赖的要放后面。另外:编译好的动态库要指定路径,否则运行时找不到动态库的位置。

    五。结论

        由于本测试的初衷是找出一种方法使得编译可执行程序时不链接那些被依赖的库,因此第二行和第五行的组合可以作为备选方案。

    展开全文
  • 编译FFmpeg静态库

    千次阅读 2019-04-04 11:37:27
    ffmpeg是很好的开源工具,对做视频理解来说很有帮助,内部机制也很经典,经过优化后的ffmpeg...有时候,需要编译ffmpeg的静态库,方便部署: ./configure --prefix=$FFMPEG_HOME--pkg-config-flags="--static" ...

    ffmpeg是很好的开源工具,对做视频理解来说很有帮助,内部机制也很经典,经过优化后的ffmpeg解码效率更高(例如:多线程解码、关键帧解码、GPU解码等),唯一的缺点是文档比较乱,有的功能接口使用比较不清晰,

    有时候,需要编译ffmpeg的静态库,方便部署:

     

    ./configure --prefix=$FFMPEG_HOME --pkg-config-flags="--static" 即可

     

    在链接静态库时,ffmpeg的相关库的链接顺序很重要,切记

    g++ -std=c++11 -o decoder video_decoder.cpp -lglog -L$FFMPEG_HOME/lib -lavformat -lavdevice -lavcodec -lavutil -lswresample -lswscale -lpthread -ldl -lbz2 -lm -lz -llzma

     

    经常,调用ffmpeg的静态库,生成自己的动态库的时候,会遇到类似的错误:

     

    : relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC

     

    那么,如何解决呢?如何在编译ffmpeg的静态库时添加fPIC选项呢? ffmpeg许多文档说的还是不明了的。

     

    首先, 编译ffmpeg静态库的时候,执行如下操作:

    ./configure --prefix=$FFMPEG_HOME --pkg-config-flags="--static" --enable-pic --extra-cflags="-fPIC" --extra-cxxflags="-fPIC"

    其次,在链接ffmpeg静态库的时候,如下配置编译选项(-Wl,-Bsymbolic ):

    gcc -std=c++11 -shared -fPIC -Wl,-Bsymbolic -O3 -fvisibility=hidden -o libvideoaction.so *.cpp -lglog -I. -I$FFMPEG_HOME/include -L$FFMPEG_HOME/lib -lavformat -lavdevice -lavco    dec -lavutil -lswresample -lswscale -ldl -lbz2 -lm -lz -llzm即可

     

    如果遇到麻烦,删除整个ffmpeg代码目录,然后重新下载源码,执行 之前的configure操作即可

     

    展开全文
  • Qt编译生成静态库(静态编译

    千次阅读 2013-10-14 16:39:24
    Qt编译生成静态库(静态编译

    开发环境:vs2008+Qt4.8.4源码库

    其他环境请自己尝试,原理应该是差不多的


    Qt编译生成静态库

     

    1.         本教程只针对在win32平台,使用VS开发工具(例子以VS2008为例)

    2.         下载Qt的源代码(针对Qt4,关于Qt5没测试过)

    3.         解压Qt源代码到目标目录,:

    4.         打开” mkspecs”目录,找到目标平台的文件夹,:” win32-msvc2008”;打开” qmake.conf”文件,找到下面语句:

    QMAKE_CFLAGS_RELEASE    = -O2 -MD

    QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi

    QMAKE_CFLAGS_DEBUG      = -Zi MDd

    改为

    QMAKE_CFLAGS_RELEASE    = -O2 -MT

    QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi

    QMAKE_CFLAGS_DEBUG      = -Zi MTd

     

    5.         Qt源代码目录下新建三个bat文件,分别为environment.batconfigure.batcompile.bat,分别功能为:设置环境变量、设置configure参数、开始编译,三个文件内容如下:

    environment.bat:

    set QTDIR=%CD%

    set PATH=%PATH%;%QTDIR%/bin

    set QMAKESPEC=win32-msvc2008          // win32-msvc2008根据实际平台进行修改

    "D:/Tools/Microsoft Visual Studio 9.0/VC/vcvarsall.bat" x86       //”D:/Tools/Microsoft Visual Studio 9.0/VC/vcvarsall.bat”根据安装的VS版本与路径进行修改

             configure.bat

    configure -debug-and-release -opensource -static -fast -qt-sql-sqlite -qt-sql-odbc -qt-libpng -qt-libmng -qt-libjpeg -platform win32-msvc2008      // 根据需要自己填写,

    可使用configure –h相看相关参数

    compile.bat

             nmake

             nmake confclean               // 此句可写可不写

    6.         打开VS的命令提示,开始à程序à Microsoft Visual Studio 2008à Visual Studio Toolsà Visual Studio 2008 命令提示

    7.         使用”cd”命令去到Qt源代码目录,

    8.         依次执行下面命令(编译前可以将源代码下的example文件夹删掉,加快编译速度):

     

    会提示是否接收License,输入”Y”后按回车即可

    漫长等待,编译完成后,查看Qt源代码目录下的”lib”目录是否已生成后缀为”lib”的静态库

    9.         编译成功后,打开VS添加Qt的静态版本。VS2008-Qt-qt optaions-qt versions-add,将Qt源代码目录的路径添加进来(如F:\qt-opensource-4.8.4-static,这个路径就是刚刚编译好的静态QT库)

    10.     使用VS新建一个Qt工程,然后选择Qt的静态版本,若是DEBUG版本选择项目属性àC/C++à代码生成à运行时库à多线程调试(/MTd);链接器à输入à附加依赖项中加入” ws2_32.lib winmm.lib imm32.lib”这三个库à确定à编译; 若是RELEASE版本选择项目属性àC/C++à代码生成à运行时库à多线程(/MT);链接器à输入à附加依赖项中加入” ws2_32.lib winmm.lib imm32.lib”这三个库à确定à编译;


    展开全文
  • 静态库.a编译静态库.a合并

    千次阅读 2018-08-03 09:46:40
    静态库生成  第一步:生成test.o目标文件,使用gcc -c test.c -o test.o命令。  第二步:使用ar将test.o打包成libtest.a静态库,使用ar rcs -o libtest.a test.o命令  第三步:生成libtest.a静态库后,可以使用...
  • Duilib编译静态库

    千次阅读 2015-05-17 22:08:08
    Duilib编译静态库 有很多人不知道如何编译静态库,其实很简单的。 首先在vs中设置duilib项目。如图:配置类型改为静态库。 第二步修改UIlib.h头文件上面的宏。如图:   第三步在这个头文件...
  • 静态库编译链接

    千次阅读 2018-12-01 16:58:52
    编译静态库时,源文件中可以只提供函数声明,具体的实现交给调用该静态库的人去做。   假设有a.c和b.c,a.c中声明并调用了fun1(),但是在b.c中实现fun1()。 a.c #include <stdio.h> extern...
  • VS2017+QT5.10编译QT静态库

    千次阅读 2017-12-17 19:33:08
    VS2017+QT5.10编译QT静态库
  • Ubuntu下编译Ffmpeg静态库

    千次阅读 2014-03-31 09:27:46
    在开发一款android平台下的视频播放器,底层解码选择用开源解码库Ffmpeg,需要编译生成静态库。  编译的环境:  ubuntu 12.04 64bit  android-ndk-r9d linux 64bit,下载地址:android ndk下载地址  ffmpeg ...
  • mhook编译静态库

    千次阅读 2013-10-23 01:15:08
    编译静态库时没有问题,可是到了主程序中编译时总是出现链接错误,提示 _InitDisassembler找不到符号.解决方法:找到静态库工程的disasm.c文件,右键属性-C\C++-高级-编译为:选择编译为C代码即可
  • linux 编译 依赖静态库静态库问题

    千次阅读 2017-09-29 11:45:11
    最近工作中遇到一个linux编译问题,其实是小问题,但经验不足,弄了2天,特做记录。 背景--------------------------------- 这次是做一个新的项目,项目软件编译架构如下图: |-----libm1.a |----...
  • 静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中。 a)优点 编译后,可执行文件不需要外部支持; b)缺点 生成的可执行程序大;静态库改变了,就...
  • 静态链接静态链接已经把中的函数写入到可执行文件内部了。也即静态链接把需要的库函数放进了你的exe之中。所以静态编译必然通过静态链接来实现。 动态链接:动态链接就是只把中函数的定位信息写入到可执行...
  • gcc 编译链接生成sqlite动态库和静态库动态库 gcc -o libsqlite3.so -fPIC --shared sqlite3.c静态库: gcc -c sqlite3.c -o sqlite3.o(临时文件,用后可删除) ar -r sqlite3.a sqlite3.o链接动态库: g++ ...
  • linux 动态库和静态库编译链接方法

    千次阅读 2013-10-10 22:34:16
    linux静态库 .a 注意命名必须为libXXX.a,不能随便起名字 其编译方法为: 静态库:  g++ -c 2.cpp  ar -cr libmy2.a 2.o  g++ -o main 1.cpp -L. -lmy2 (与动态链接方法一样) 动态库:  
  • VS在工程中引用静态库时,需要注意...3.编译静态库的平台工具集最好不要超过工程的平台工具集,用V100编译静态库,工程也使用v100或者v100以上 4.字符集最好保持一致 5.x86版本编译静态库和x64版本工程不能...
  • 无聊,遂准备写一篇博客,介绍一下C和C++运行,只因发现工作几年的人对此一知半解的大有人在。    在使用VC构建项目时,经常会遇到下面的链接错误:      初学者面对这些错误常常不知所错:...
  • 编译java静态库,java共享库

    千次阅读 2017-02-17 18:27:09
    把这段复制到app下的Android.mk的最后,可以编译出java共享库,这个.jar除了生成在\out\target\common\obj\JAVA_LIBRARIES这里,还会copy到\out\target\product\***\system\framework下,如果只是使用java静态库,...
  • 正确编译 DuiLib 静态库的方法

    千次阅读 2017-01-10 13:45:17
    使用 DuiLib 做过一个非常小的项目,当时因为没有研究清楚如何编译静态库遂使用了 DuiLib.dll 的动态库来做的。最近自己又有使用 DuiLib 的需求,而且希望能编译静态库使用,所以研究了一下(在群里也有很多朋友...
  • Linux制作动态库和静态库 命名规则 静态库命名规则如下: libxxx.o lib:前缀 .o:静态库 动态链接库(shared object file,共享对象文件)命名规则如下: libxxx.so lib:前缀 .so:动态库 动态库...
  • Makefile链接静态库.a编译成动态库.so

    千次阅读 2020-03-18 10:00:03
    #静态库编译 BIN=liba.a CC=gcc AR=ar rcs CFLAGS= -shared -fPIC LIBS= INCS=-I. SRCS:=$(wildcard *.c) COBJS:=$(SRCS:.c=.o) all:$(BIN) $(COBJS) : %.o: %.c $(CC) -c $< -o $@ $(INCS) $(CFLAGS) $(LIBS...
  • android编译openssl静态库.a 动态库.so

    千次阅读 2017-08-09 17:51:59
    android编译openssl静态库.a 动态库.so 编译静态库:./make_static.sh 编译动态库:./make_share.sh openssl-sdk-demo:包括ssl-client.c和ssl-server.c 下载链接:...
  • 界面库Duilib编译静态库

    万次阅读 2012-07-25 17:54:10
    有很多人不知道如何编译静态库,其实很简单的。 首先在vs中设置duilib项目。如图:配置类型改为静态库。 第二步修改UIlib.h头文件上面的宏。如图: #define UILIB_API  #pragma comment(lib, "Comctl32...
  • 假设生成了两个静态库liba.a和libb.a,这两个静态...这个是编译器再链接静态库时是一个调用一个,顺序不是我们理解的先-lb再-la,而是先-la再-lb,这个顺序只要对了,就可以编译通过。另外a静态库需要包含b静态库的头文
  • opencv交叉编译生成静态库编译demo

    千次阅读 2018-01-28 21:22:46
    因工作需要,需在marvell平台上交叉编译出一个静态链接opencv的可执行文件,只调用了其中的imread,resize等少数几个函数。所以我最终只交叉编译了一部分的链接库,video相关的基本都没有编译,这个后续也会描述到...
  • gcc编译可执行文件 链接静态库

    千次阅读 2018-05-04 10:32:16
    使用别人提供的静态库编译可执行文件,出错:/usr/bin/x86_64-linux-gnu-ld: libxxx.a(event.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -...
  • OpenCV - 编译静态OpenCV库(静态库)

    千次阅读 2018-07-05 00:19:27
    在一个项目中需要用到OpenCV,刚开始使用...需要编译成静态库以便于应用程序链接。 网上有的教程中写的在VC++2010下安装OpenCV2.1时用到了TBB库,而我在编译链接自己的程序后需要用到TBB.dll。本人设计的目的就是要...
  • 但是我总觉得之间不应该有依赖关系,毕竟链接库就是个找符号的问题,如果有依赖,那a,b两个,相互依赖,顺序怎么整呢?大型的软件,岂不是加一个就要弄死人?带着这个疑问我做了一些小实验,来看一下一下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 163,651
精华内容 65,460
关键字:

编译链接静态库