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
参考一下
http://blog.csdn.net/hqin6/archive/2010/06/27/5698228.aspx
- C/C++ code
g++ -o main main.o libsub.a -L. -ladd