构建和链接共享库

时间:2012-05-25 05:43:41

标签: g++ cygwin shared-libraries

我试图使用g ++在windows cygwin平台上构建一个共享库,然后将其与另一个cpp文件链接: 我使用以下命令:

// generate object file

g++ -g -c -Wall -fPIC beat11.cpp -o beat11.o

// to generate library from the object file

g++ -shared -Wl,-soname,libbeat.so.1 -o libbeat.so.1.0.1 beat11.o -lc

// to link it with another cpp file; -I option to refer to the library header file

g++ -L. -lbeat -I . -o checkbeat checkbeat.cpp
链接时

,会出现以下错误:

/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../../i686-pc-cygwin/bin/ld: 
     cannot find -llibbeat.so.1.0.1

collect2: ld returned 1 exit status

库创建得很好,但我只能找到libbeat.so.1.0.1,而不是libbeat.so或libbeat.so.1(或者它们不应该在那里?)

其中一个问题建议为libbeat.so.1.0.1创建一个符号链接,但这也没有用

1 个答案:

答案 0 :(得分:17)

使用-l<libname>指定要链接的库时,链接器会先搜索lib<libname>.so,然后再搜索lib<libname>.a

在您的情况下,它不起作用,因为库文件名不带.so后缀。

您可以创建simlink

libbeat.so -> libbeat.so.1.0.1

libbeat.so -> libbeat.so.1
libbeat.so.1 -> libbeat.so.1.0.1

您也可以使用-l:libbeat.so.1.0.1(如果您的链接器支持它,请检查man ld -l参数的说明)。另一种选择是指定不带-l

的库
g++ -o checkbeat checkbeat.cpp -I . -L. libbeat.so.1.0.1

请注意,您链接到的库应该使用其符号放在对象/源文件之后 - 否则链接器可能找不到符号。