.so linux 编译 缺少
2014-03-26 19:16:23 q96456 阅读数 2219

阿里云这坑爹的玩意,不再对32为系统支持,没办法,我们只能将我们的程序移植到64位下。

我编译一个so文件这个文件应用了几个第三方静态库,当然,第三方已经为我们提供了64位的静态库,编译动态库需要使用-fPIC选项,但是我编译不通过,提示为:relocation R_x86_64_32 against 'a local symbol' can not be used when making a shared object; recompile whth -fPIC。这就奇怪了,我用了-fPIC啊。后来上网查找,可能引起问题的是静态库没有使用这个选项,当然静态库不是必须使用这个选项的,只是在64位下检查可能比较严格,让第三方使用-fPIC重新编译了一下,OK了

2014-12-31 17:36:43 wei_xiaox126 阅读数 1388
有以下几种提示:
1.缺少动态连接库.so-cannot open shared object file:No such file or directory
2.缺少动态连接库.so.0-cannot open shared object file:No such file or directory
3.缺少动态连接库.so.1-cannot open shared object file:No such file or directory
可以直接: # sudo ldconfig
再编译,如果不行,按一下方法做:
总结下来主要有3种方法:
1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
ln -/where/you/install/lib/*.so /usr/lib
sudo ldconfig

2.修改LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/where/you/install/lib:$LD_LIBRARY_PATH
sudo ldconfig

3.修改/etc/ld.so.conf,然后刷新

vim /etc/ld.so.conf

add /where/you/install/lib

sudo ldconfig
部分转载:http://www.cnblogs.com/smartvessel/archive/2011/01/21/1940868.html
2015-03-26 14:47:01 sfdazsdf 阅读数 383
    A shared library (also known as a shared object, or as a dynamically linked library) is similar to a archive in that it is a grouping of object files. However, there are many important differences.The most fundamental difference is that when a shared library is linked into a program, the final executable does not actually contain the code that is present in the shared library. Instead, the executable merely contains a reference to the shared library. If several programs on the system are linked against the same shared library, they will all reference the library, but none will actually be included.Thus, the library is “shared” among all the programs that link with it.

     A second important difference is that a shared library is not merely a collection of object files, out of which the linker chooses those that are needed to satisfy undefined references. Instead, the object files that compose the shared library are combined into a single object file so that a program that links against a shared library always includes all of the code in the library, rather than just those portions that are needed.

     To create a shared library, you must compile the objects that will make up the library using the -fPIC option to the compiler, like this:

% gcc -c -fPIC test1.c

     The -fPIC option tells the compiler that you are going to be using test.o as part of a shared object.

                                                                             ---摘自《Advanced Linux Programming》

由上面可以看到,linux操作系统中,
1.和静态库类似,动态库文件也是一些目标文件(后缀名为.o)的集合体而已。
2.动态库的后缀名是.so,对应于windows操作系统的后缀名为.dll的动态库。
3.可以使用gcc命令来创建一个动态库文件。
来看一个实例,和静态库的代码实际是一样的。先看看可以编译成库文件的源文件中的代码:

  1. /*  test.c  */  
  2. int f()   
  3. {  
  4.   return 3;  
  5. }  

代码非常简单。我们敲入下列命令:
gcc -c -fPIC test.c
gcc -shared -fPIC -o libtest.so test.o
会在当前目录下生成一个libtest.so动态库文件。再看如何使用这个库。看如下代码:

  1. /*  app.c   */  
  2. #include <stdio.h>  
  3. extern int f();  
  4. int main()   
  5. {  
  6.   printf(“return value is %d\n”,f());  
  7.   return 0;  
  8. }  

敲入如下命令:
gcc –c app.c
gcc -o app app.o -L. –ltest
敲命令的时候要记得将libtest.a文件和生成的app.o文件放在同一个目录(即当前目录)下。这样,敲入命令后,会在当前目录下生成一个名为app的可执行文件。但是当我们执行./app命令,来执行这个可执行文件时,却提示如下错误:

这就奇怪了,libtest.so文件明明就在当前目录下,为什么会提示找不到呢?继续看书,书上有这样的话:
     When you link a program with a shared library, the linker does not put the full path to the shared library in the resulting executable. Instead, it places only the name of the shared library.When the program is actually run, the system searches for the shared library and loads it.The system searches only /lib and /usr/lib, by default.If a shared library that is linked into your program is installed outside those directories, it will not be found, and the system will refuse to run the program.
原来linux和windows的机制是不同的,它不会在当前目录下寻找动态连接库文件,它只会在标准路径下寻找。(The system searches only /lib and /usr/lib, by default.)。我们可以使用一个命令,使得操作系统去我们指定的路径下面去寻找。假设libtest.so文件所在的目录是/root/Desktop/aabb,那么执行命令
export LD_LIBRARY_PATH=/root/Desktop/aabb
后,再执行./app,我们发现,程序就正常运行了。


附上原文地址 : http://blog.csdn.net/haojiahuo50401/article/details/7101669

2016-11-09 11:38:12 xIsidro9293 阅读数 4924

   Linux平台FFmpeg的编译非常简单:

    1.获取FFmpeg源码,下载或clone.
       下载:
       地址: http://ffmpeg.org/download.html   下载最新版本
       解压缩:tar -zxvf ffmp..
    
       clone
       使用终端命令: sudo git clone https://git.ffmpeg.org/ffmpeg.git

    2.编译
      终端命令:
    1).配置configure
    ./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg

        //--enable-shared // 编译共享库
    //--disable-yasm  //不使用yasm ,默认使用yasm配置会很麻烦,需要下载yasm
    //--prefix=/usr/local/ffmpeg  //编译完成后输出我们要用的文件路径

    //最简化的配置方式,编译出来的库也最大,可以参照ffmpeg功能清单去掉不必要的功能减少库的体积,定制自己的ffmpeg

    2).编译
    make
    
    
    3).编译安装
    sudo make install


    然后就能在/usr/local/ffmpeg/路径下找到 include里的头文件 和 lib里的.so文件 

2013-06-01 08:21:32 ronon77 阅读数 9
在modules目录中只有httpd.exp,那些so文件呢?

我尝试在fedora core 3中安装apache 2. 当我解压了apache 2.0.54后使用configure工具并且加入了 --enable-so 或者 --enable-modules=so (两个我都试过了)
去make并且make install了。我希望在/apache2/modules/目录里有各种模块,但是这个文件最后只包含了一个httpd.exp文件。 为什么?哪里出错了?
谢谢


Because you're just telling apache to enable the use of shared modules. You also need to tell it to MAKE the shared modules.

You can use these compile flags:
--enable-mods-shared='headers rewrite dav' (where you list the mods. you want)
--enable-mods-shared=most ( compiles "most" modules )
--enable-mods-shared=all ( compiles all modules )

因为你只告诉了apache可以使用共享模块。你还需要告诉它要MAKE共享模块

你可以使用如下的这些编译标志
--enable-mods-shared='headers rewrite dav' (凡是你想编译的模块都可以写到后边的引号里面,以空格分隔)
--enable-mods-shared=most (编译最多的模块)
--enable-mods-shared=all (编译所有模块)




当我按照上面的方法使用命令 ./configure --enable-so --enable-mods-shared=most 之后,果然编译出了很多的模块,问题解决了。
没有更多推荐了,返回首页