日期:2014-05-16  浏览次数:20934 次

linux编译同时链接静态和动态库
一个测试程序想同时链接静态库和动态库:

dynamic.cpp 动态库代码如下;

#include <iostream>

using namespace std;

int math_sub( int a, int b )
{
  return a - b;
}

编译动态库:

g++ -Wall -shared -o ../lib/libdynamic.so.1 dynamic.cpp

成功得到libdynamic.so.1


staticlib.cpp 静态库代码如下:

#include <iostream>

using namespace std;

int math_add( int a, int b )
{
  return a + b;
}

编译静态库;

g++ -c -o ../lib/libstatic.o staticlib.cpp

ar -cvp libstatic.a.1 libstatic.o

成功得到libstatic.a.1


main.cpp 调用程序代码如下:

#include <iostream>

using namespace std;

int math_add(int,int);
int math_sub(int,int);

int main( int argv, char** argc )
{
  cout<<"now call function in static lib"<<endl;
  cout<<"add result:"<<math_add(2,3)<<endl;
  cout<<"sub result:"<<math_sub(3,2)<<endl;
}

接下来我们编译main.cpp

g++ -Wall -o main ../lib/libstatic.a.1 ../lib/libdynamic.so.1 main.cpp

结果出错了:

undefined reference to 'math_add(int, int)'

math_add是staticlib.cpp中函数,怎么找不到呢?好,先用:

nm ../lib/libstatic.a.1

查看一下,发现有导出这个函数啊。


我换一个顺序吧:

g++ -Wall -o main main.cpp ../lib/libstatic.a.1 ../lib/libdynamic.so.1

结果成功了。


我百思不得其解,如果有高人路过,请指点。


接下来,我们使用另外一种方式编译:

g++ -Wall -o main main.cpp -L../lib/ -ldynamic -lstatic

结果:

cannot find -ldynamic


这个也是无法解释.

------解决方案--------------------
关于顺序的问题,这个算链接器开关,不是编译开关,所以一般都是放在最后作为链接开关,如果怀疑,那么加入-v来判断到底传递成功没

cannot find -ldynamic
说明没有找到libdynamic.so
你需要做下libdynamic.so.1的软链接
------解决方案--------------------
-lxxx 只能搜索到 libxxx.a/libxxx.so 文件吧

Perl code

ln -sv libdynamic.so.1 libdynamic.so
ln -sv libstatic.a.1 libstatic.a

------解决方案--------------------
-ldynamic -lstatic
检查一下存在
libdynamic.a否
------解决方案--------------------
第一个问题 make -n看一下
第二个问题1L已经回答
------解决方案--------------------
可能楼主把编译和链接分成两个步骤做会比较好.
------解决方案--------------------
不是让你确定是否存在libdynamic.so.1和libstatic.a.1
而是确定libdynamic.so和libstatic.a

如果是
-ldynamic -lstatic
那么需要确定libdynamic.a
------解决方案--------------------
探讨
不是让你确定是否存在libdynamic.so.1和libstatic.a.1
而是确定libdynamic.so和libstatic.a

如果是
-ldynamic -lstatic
那么需要确定libdynamic.a

------解决方案--------------------
参考一下
http://blog.csdn.net/hqin6/archive/2010/06/27/5698228.aspx
------解决方案--------------------
C/C++ code
g++ -o main main.o libsub.a -L. -ladd

------解决方案--------------------
探讨
C/C++ code


------解决方案--------------------
探讨

引用:
C/C++ code



根据justkk哥哥的帖子,再次修改= =.

g++ -o main main.o -L. -ladd libsub.a