我试图使用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创建一个符号链接,但这也没有用
答案 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
请注意,您链接到的库应该使用其符号放在对象/源文件之后 - 否则链接器可能找不到符号。