linux编译同时链接静态和动态库

foxavideo 2011-10-24 09:14:49
一个测试程序想同时链接静态库和动态库:

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


这个也是无法解释.
...全文
450 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
koutatu 2011-10-30
  • 打赏
  • 举报
回复
按照你第一次出错的方法,在ar之后,使用ranlib对静态库的符号索引表进行更新一下
IterZebra 2011-10-27
  • 打赏
  • 举报
回复
mark一下,以后看贴。
qq120848369 2011-10-26
  • 打赏
  • 举报
回复
.a你就当做.o用,.so你就当做动态库-l用。
foxavideo 2011-10-26
  • 打赏
  • 举报
回复
抱歉,csdn把我的写的格式搞乱了,我换种方式;
testlib
-bin
-lib
----libdynamic.so.1
----libstatic.a.1
----libstatic.o
-src
----dynamiclib.cpp
----staticlib.cpp
----main.cpp
foxavideo 2011-10-26
  • 打赏
  • 举报
回复
为什么同时链接静态和动态库,因为我从别人那里拿到关于编码的库是动态库,而解码的是静态库,这样我的工程里就要既链接动态库,又链接静态库。

为了更好说明问题,我把目录结构和文件都列出来:
testlib
-bin
-lib
-libdynamic.so.1
-libstatic.a.1
-libstatic.o
-src
-dynamiclib.cpp
-staticlib.cpp
-main.cpp
xunxun 2011-10-26
  • 打赏
  • 举报
回复
我们说了半天,lz一条都没采用
勤奋的沉沦 2011-10-25
  • 打赏
  • 举报
回复
动态库没有导出函数。动态库的引用需要使用-lxxx。这里你需要做一个软链接。
另外,动态库和静态库为什么要一起引用?
xunxun 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 huangxiansheng1980 的回复:]

libdynamic.so.1和libdynamic.so在使用-L 方式链接时是一样的
[/Quote]
这俩不可能一样,
如果一样,你有libdynamic.so.2的话,他到底链接哪一个,所以ld必须选择.so的形式,无论实体文件或者软链接
这是ld的源码决定的
xunxun 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 huangxiansheng1980 的回复:]

不许要extern "C"因为全是C++的代码。
因为我既用动态库又用静态库,所以不能使用-static吧
libdynamic.so.1和libdynamic.so在使用-L 方式链接时是一样的
[/Quote]
什么意思?如果既要链接动态库又要链接静态库的话
那么可以链接全路径全名
也可以使用-l的形式,但必须保证必须是.so或者.a的形式(实体文件或者软链接,必须存在),而且静态库没有动态形式
因为ld会优先链接动态库
xunxun 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qq120848369 的回复:]

引用 11 楼 qq120848369 的回复:
C/C++ code



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

g++ -o main main.o -L. -ladd libsub.a
[/Quote]
要注意,如果是libsub.a这种全名,要把它放在当前目录
foxavideo 2011-10-24
  • 打赏
  • 举报
回复
不许要extern "C"因为全是C++的代码。
因为我既用动态库又用静态库,所以不能使用-static吧
libdynamic.so.1和libdynamic.so在使用-L 方式链接时是一样的
qq120848369 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qq120848369 的回复:]
C/C++ code

[/Quote]

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

g++ -o main main.o -L. -ladd libsub.a
qq120848369 2011-10-24
  • 打赏
  • 举报
回复
g++ -o main main.o libsub.a -L. -ladd 
justkk 2011-10-24
  • 打赏
  • 举报
回复
参考一下
http://blog.csdn.net/hqin6/archive/2010/06/27/5698228.aspx
qq120848369 2011-10-24
  • 打赏
  • 举报
回复
楼主C++写的函数不用extern "C" 的么.
qq120848369 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xunxun1982 的回复:]
不是让你确定是否存在libdynamic.so.1和libstatic.a.1
而是确定libdynamic.so和libstatic.a

如果是
-ldynamic -lstatic
那么需要确定libdynamic.a
[/Quote]

++

使用静态库的时候明确使用-static xxx.a 试一下.
xunxun 2011-10-24
  • 打赏
  • 举报
回复
不是让你确定是否存在libdynamic.so.1和libstatic.a.1
而是确定libdynamic.so和libstatic.a

如果是
-ldynamic -lstatic
那么需要确定libdynamic.a
foxavideo 2011-10-24
  • 打赏
  • 举报
回复
非常感谢各位的回复。
1. libdynamic.so.1和libstatic.a.1的确存在的。

2. make -n,我并没有使用makefile,

回复: fox000002
你能说的再详细点吗

回复:qq120848369
其实为了解决问题,分开的方式我也试过了
qq120848369 2011-10-24
  • 打赏
  • 举报
回复
可能楼主把编译和链接分成两个步骤做会比较好.
delphiwcdj 2011-10-24
  • 打赏
  • 举报
回复
第一个问题 make -n看一下
第二个问题1L已经回答
加载更多回复(3)

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧