2

我正在使用 gnu49 compile 编译一个 qt5 c++ 项目,同时在 Mac OSX El Captitan 上使用 c++11 标志和通常的 qt 框架标志链接一些其他 dylib(犰狳、boost 库等)。该项目编译良好,但为了使其在其他几台机器上更具可移植性,我试图静态链接几个动态库。我在(要静态链接的)库(例如-static -lboost_thread)之前添加了 -static 标志,如此处所述。

https://gcc.gnu.org/ml/gcc/2000-05/msg00517.html

但是,我收到以下错误。

ld:找不到-lcrt0.o collect2的库:错误:ld返回1退出状态

我验证了该错误仅在尝试静态链接而不是动态链接时出现。

4

1 回答 1

2

您正在应用的 GCC 的-staticoption是非位置的。它强制所有库的静态链接。您的链接然后失败,因为您的系统没有静态版本libcrt0.o

您可能会将 GCC 的static选项与ld'-static选项(同义词:-Bstatic, -dn -non_shared)混淆,后者位置性的。它仅影响命令行上的后续库。它与链接器的-Bdynamic选项相反(同义词:-dy, -call_shared)。

因此,要通过 GCC 静态链接库-lfoo... ,您可以在提及它们之前和之后传递给链接器:-lbar-Bstatic-Bdynamic

-Wl,-Bstatic -lfoo -lbar -Wl,-Bdynamic

不要省略 final -Wl,-Bdynamic,即使-lbar是您的最后一个库,因为 GCC 会悄悄地将标准库附加到您的链接中(如您所见)。

于 2016-09-03T17:46:51.853 回答