19

我正在尝试使用 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 的符号链接,但这也不起作用

4

1 回答 1

22

使用-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

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

于 2012-06-05T13:40:57.080 回答