在Cygwin中,ld无法找到已存在的库

1 投票
2 回答
1631 浏览
提问于 2025-04-16 22:32

我正在尝试安装 p4python,这是一个用于Perforce版本控制系统的Python扩展。我使用Cygwin来完成这个安装,因为 p4python 需要P4 C++ API(其实就是一个包装),而这个又需要g++(更不用说,Python扩展还需要一个C编译器,所以需要gcc)。我现在在Windows 7 64位系统上(不是我愿意的),而且Microsoft VS 2008给我带来了很多麻烦;我听说使用Cygwin/MinGW可能会更好一些。我也查找了一些相关的问题,但似乎没有找到特别相关的答案。

我能想到的最好的情况是ld在错误的地方寻找这些库,而且我听说Cygwin对符号链接的处理不是很好,但我不知道接下来该怎么做。下面是终端输出:

API Release 2010.2
running install
running build
running build_py
running build_ext
building 'P4API' extension
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DID_OS="CYGWINX86" -DID_REL="2009.2" -DID_PATCH="240822" -DID_API="2010.2" -DID_Y="2010" -DID_M="04" -DID_D="02" -IC:\Python\p4api\p4api-2010.2.295040-vs2010_static\ -IC:\Pyt
hon\p4api\p4api-2010.2.295040-vs2010_static\/include/p4 -I/usr/include/python2.6 -c P4API.cpp -o build/temp.cygwin-1.7.9-i686-2.6/P4API.o -DOS_CYGWIN -DOS_CYGWIN -DOS_CYGWINX86 -DOS_CYGWINX86
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DID_OS="CYGWINX86" -DID_REL="2009.2" -DID_PATCH="240822" -DID_API="2010.2" -DID_Y="2010" -DID_M="04" -DID_D="02" -IC:\Python\p4api\p4api-2010.2.295040-vs2010_static\ -IC:\Pyt
hon\p4api\p4api-2010.2.295040-vs2010_static\/include/p4 -I/usr/include/python2.6 -c PythonClientAPI.cpp -o build/temp.cygwin-1.7.9-i686-2.6/PythonClientAPI.o -DOS_CYGWIN -DOS_CYGWIN -DOS_CYGWINX86 -DOS_CYGWINX86
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DID_OS="CYGWINX86" -DID_REL="2009.2" -DID_PATCH="240822" -DID_API="2010.2" -DID_Y="2010" -DID_M="04" -DID_D="02" -IC:\Python\p4api\p4api-2010.2.295040-vs2010_static\ -IC:\Pyt
hon\p4api\p4api-2010.2.295040-vs2010_static\/include/p4 -I/usr/include/python2.6 -c PythonClientUser.cpp -o build/temp.cygwin-1.7.9-i686-2.6/PythonClientUser.o -DOS_CYGWIN -DOS_CYGWIN -DOS_CYGWINX86 -DOS_CYGWINX86
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
PythonClientUser.cpp: In member function ‘virtual int PythonClientUser::Resolve(ClientMerge*, Error*)’:
PythonClientUser.cpp:423: warning: deprecated conversion from string constant to ‘char*’
PythonClientUser.cpp:423: warning: deprecated conversion from string constant to ‘char*’
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DID_OS="CYGWINX86" -DID_REL="2009.2" -DID_PATCH="240822" -DID_API="2010.2" -DID_Y="2010" -DID_M="04" -DID_D="02" -IC:\Python\p4api\p4api-2010.2.295040-vs2010_static\ -IC:\Pyt
hon\p4api\p4api-2010.2.295040-vs2010_static\/include/p4 -I/usr/include/python2.6 -c SpecMgr.cpp -o build/temp.cygwin-1.7.9-i686-2.6/SpecMgr.o -DOS_CYGWIN -DOS_CYGWIN -DOS_CYGWINX86 -DOS_CYGWINX86
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
SpecMgr.cpp: In member function ‘PyObject* SpecMgr::NewSpec(StrPtr*)’:
SpecMgr.cpp:550: warning: deprecated conversion from string constant to ‘char*’
SpecMgr.cpp:550: warning: deprecated conversion from string constant to ‘char*’
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DID_OS="CYGWINX86" -DID_REL="2009.2" -DID_PATCH="240822" -DID_API="2010.2" -DID_Y="2010" -DID_M="04" -DID_D="02" -IC:\Python\p4api\p4api-2010.2.295040-vs2010_static\ -IC:\Pyt
hon\p4api\p4api-2010.2.295040-vs2010_static\/include/p4 -I/usr/include/python2.6 -c P4Result.cpp -o build/temp.cygwin-1.7.9-i686-2.6/P4Result.o -DOS_CYGWIN -DOS_CYGWIN -DOS_CYGWINX86 -DOS_CYGWINX86
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
P4Result.cpp: In destructor ‘P4Result::~P4Result()’:
P4Result.cpp:49: warning: suggest explicit braces to avoid ambiguous ‘else’
P4Result.cpp:52: warning: suggest explicit braces to avoid ambiguous ‘else’
P4Result.cpp:55: warning: suggest explicit braces to avoid ambiguous ‘else’
P4Result.cpp: In member function ‘void P4Result::Reset()’:
P4Result.cpp:71: warning: suggest explicit braces to avoid ambiguous ‘else’
P4Result.cpp:75: warning: suggest explicit braces to avoid ambiguous ‘else’
P4Result.cpp: In member function ‘void P4Result::Fmt(const char*, PyObject*, StrBuf&)’:
P4Result.cpp:189: warning: deprecated conversion from string constant to ‘char*’
P4Result.cpp:189: warning: deprecated conversion from string constant to ‘char*’
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DID_OS="CYGWINX86" -DID_REL="2009.2" -DID_PATCH="240822" -DID_API="2010.2" -DID_Y="2010" -DID_M="04" -DID_D="02" -IC:\Python\p4api\p4api-2010.2.295040-vs2010_static\ -IC:\Pyt
hon\p4api\p4api-2010.2.295040-vs2010_static\/include/p4 -I/usr/include/python2.6 -c PythonMergeData.cpp -o build/temp.cygwin-1.7.9-i686-2.6/PythonMergeData.o -DOS_CYGWIN -DOS_CYGWIN -DOS_CYGWINX86 -DOS_CYGWINX86
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DID_OS="CYGWINX86" -DID_REL="2009.2" -DID_PATCH="240822" -DID_API="2010.2" -DID_Y="2010" -DID_M="04" -DID_D="02" -IC:\Python\p4api\p4api-2010.2.295040-vs2010_static\ -IC:\Pyt
hon\p4api\p4api-2010.2.295040-vs2010_static\/include/p4 -I/usr/include/python2.6 -c P4MapMaker.cpp -o build/temp.cygwin-1.7.9-i686-2.6/P4MapMaker.o -DOS_CYGWIN -DOS_CYGWIN -DOS_CYGWINX86 -DOS_CYGWINX86
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DID_OS="CYGWINX86" -DID_REL="2009.2" -DID_PATCH="240822" -DID_API="2010.2" -DID_Y="2010" -DID_M="04" -DID_D="02" -IC:\Python\p4api\p4api-2010.2.295040-vs2010_static\ -IC:\Pyt
hon\p4api\p4api-2010.2.295040-vs2010_static\/include/p4 -I/usr/include/python2.6 -c PythonSpecData.cpp -o build/temp.cygwin-1.7.9-i686-2.6/PythonSpecData.o -DOS_CYGWIN -DOS_CYGWIN -DOS_CYGWINX86 -DOS_CYGWINX86
cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++
g++ -shared -Wl,--enable-auto-image-base build/temp.cygwin-1.7.9-i686-2.6/P4API.o build/temp.cygwin-1.7.9-i686-2.6/PythonClientAPI.o build/temp.cygwin-1.7.9-i686-2.6/PythonClientUser.o build/temp.cygwin-1.7.9-i686-2.6/SpecMgr.o build/temp.cygwin-1.7.
9-i686-2.6/P4Result.o build/temp.cygwin-1.7.9-i686-2.6/PythonMergeData.o build/temp.cygwin-1.7.9-i686-2.6/P4MapMaker.o build/temp.cygwin-1.7.9-i686-2.6/PythonSpecData.o -LC:\Python\p4api\p4api-2010.2.295040-vs2010_static\ -LC:\Python\p4api\p4api-2010
.2.295040-vs2010_static\/lib -L/usr/lib/python2.6/config -lclient -lrpc -lsupp -lpython2.6 -o build/lib.cygwin-1.7.9-i686-2.6/P4API.dll
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: cannot find -lclient
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: cannot find -lrpc
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: cannot find -lsupp
collect2: ld returned 1 exit status
error: command 'g++' failed with exit status 1

为了更具体一点,我想问的是,ld是不是在错误的地方查找,还是说还有其他我没有注意到的问题?我已经没有其他想法了。任何帮助或指导都将非常感谢。

2 个回答

0

这个链接可能对把 .lib 文件转换成 .a 文件有帮助。

3

这里有一种方法,可以把lib文件变成共享库,以便在gcc中使用:

  1. echo EXPORTS > NAME.def
  2. nm NAME.lib | grep ' T _' | sed 's/.* T _//' >> NAME.def
  3. dlltool --input-def NAME.def --dllname NAME --output-lib libNAME.a

关于使用Cygwin的进一步说明(不过我是在一个较旧的32位系统上用gcc 3,所以你的情况可能会不同):

首先,安装gcc-mingw这个包(它包含了gcc和g++ 3所需的头文件和库),或者安装一些更新的包,这些包使用mingw-w64来支持gcc 4.5。此外,编译时要加上选项-mno-cygwin,这样可以避免把Cygwin链接到生成的可执行文件或库里。对于Python扩展,你可以通过在Lib\distutils文件夹里添加一个distutils.cfg文件,来永久配置distutils使用mingw:

[build]
compiler = mingw32   #or mingw64

[build_ext]
compiler = mingw32   #or mingw64

我会把C:\cygwin\bin添加到Windows的路径中(放在最后,以减少干扰),然后在Windows的命令行中进行编译。不过,我需要把Cygwin的符号链接替换成实际的可执行文件(也就是说,把gcc3.exe替换成gcc.exe,把g++3.exe替换成g++.exe),因为Windows的命令行不理解符号链接。到目前为止,这样编译Python 3扩展、Cython(甚至是按需编译的pyximport)、swig和嵌入Python都没有遇到问题。

撰写回答