ld无法链接主可执行文件

1 投票
1 回答
7539 浏览
提问于 2025-04-16 07:04

在OSX 10.6.4上,我用i686-apple-darwin10-g++-4.2.1通过TextMate和一个Makefile来编译,这个Makefile最初是为Linux写的,现在我想把它改成适用于OSX。

在编译一个C++项目时,我遇到了“无法链接主可执行文件”的错误:

g++ -Wall -g  -I ~/svnX-Repository/axp-Projekte/xrlfupa/trunk/src/ -I ~/svnX-Repository/boost_1_44_0  -I /opt/local/var/macports/software/boost/1.44.0_0/opt/local/lib/ -I /opt/local/var/macports/software/gsl/1.14_0/opt/local/include/ -o xrfLibTest xrfLibTest.o excitFunctions.o xrfFunctions.o filterFunctions.o detectorFunctions.o -L/opt/local/var/macports/software/boost/1.44.0_0/opt/local/lib/ -L/opt/local/var/macports/software/gsl/1.14_0/opt/local/lib/  -lm -lxrlTUB -lboost_serialization -lgsl -lgslcblas    # Debug 1
ld: in /usr/local/lib/libxrlTUB.so, can't link with a main executable
collect2: ld returned 1 exit status
make: *** [prog] Error 1

提到的那个库(libxrlTUB.so)在正确的位置(/usr/local/lib/libxrlTUB.so),但可能问题就出在这里,因为libxrlTUB.so是我自己之前编译的。编译过程是顺利的,它是通过swig生成的,不过有一个警告:

g++ -arch x86_64 -m32  -g -fpic -I /usr/include/python2.6 -c PyXrl_wrap.cxx 
In function 'void SWIG_Python_AddErrorMsg(const char*)':
warning: format not a string literal and no format arguments

根据我查到的信息,这个警告应该不是问题。(或者是吗?)

不幸的是,这整个事情是我大学的一个项目。实际上,我应该用Python写一个X射线分析的脚本,这本来没问题,只是...我还得使用这个C++项目生成的库。(之后我应该在Python中通过导入来使用它们。)

我对C++不太熟悉,也不太会在OSX系统上编译。到目前为止,我主要在搞脚本(Python、bash等)。所以可能我只是遗漏了一些简单的东西。希望有人能给我一些提示,让我知道接下来该往哪里看,以解决“无法链接主可执行文件”的错误...

提前谢谢你,
Liam

1 个回答

3

这个错误信息告诉你问题出在哪里——就是 /usr/local/lib/libxrlTUB.so 不是一个共享库,而是一个可执行文件。你不能把可执行文件当作共享库来链接。可能你在构建 libxrlTUB.so 的时候,使用的构建过程没有正确理解如何在Mac上构建共享库(这更可疑,因为 .dylib 是正确的扩展名)。

你可以看看苹果的文档,了解如何编译动态库。你可以使用 file 命令来确认你的输出文件类型是否正确,例如:

% gcc -c foo.c
% gcc -dynamiclib foo.o -o foo.dylib
% file foo.dylib
foo.dylib: Mach-O 64-bit dynamically linked shared library x86_64

如果没有加 -dynamiclib,你最终得到的就是一个可执行文件,这可能就是你遇到的问题。

撰写回答