通过 g++ 链接到外部静态库

Posted

技术标签:

【中文标题】通过 g++ 链接到外部静态库【英文标题】:link to an external static library by g++ 【发布时间】:2015-06-24 01:23:26 【问题描述】:

我正在尝试在我的 Macbook 上执行一个名为“palindrome.cpp”的 cpp 文件使用终端。此 cpp 文件使用名为“libStanfordCPPLib.a”的外部库,该库位于“DIRECTORY TO CPP FILE/StanfordCPPLib”下,该库的相应头文件也在此“StanfordCPPLib”文件夹中。 你可以通过这个截图看到文件夹结构:

我编译这个源代码的代码是:

g++-4.8 -Wall -I/Users/myName/Downloads/CS106B/palindrome/StanfordCPPLib -L/Users/myName/Downloads/CS106B/palindrome/StanfordCPPLib palindrome.cpp libStanfordCPPLib.a

据我了解,-I代表头文件所在的目录路径,-L代表库(.a文件)所在的目录路径。这就是为什么 -I 和 -L 是相同的目录路径“/Users/myName/Downloads/CS106B/palindrome/StanfordCPPLib”。

但是,执行此命令会返回错误消息:“libStanfordCPPLib.a:没有这样的文件或目录”。如截图所示:

谁能明白为什么会这样?谢谢。

【问题讨论】:

尝试执行相同的命令,从库名称“StanfordCPPLib.a”或“StanfordCPP.a”中删除部分“lib”......因为据我所知,链接器将为您的库添加前缀和后缀在搜索之前用 lib 命名。 不,它仍然无法工作。错误信息是“error: StanfordCPP.a: No such file or directory” 你尝试过 StanfordCPPLib.a 吗? 嗨,我已经通过将 LibStanfordCPPLib.a 更改为 -lStanfordCPPLib 解决了这个问题。然后就可以编译了 【参考方案1】:

试试这个,使用 -lStanfordCPPLib:

g++-4.8 -Wall -I/Users/myName/Downloads/CS106B/palindrome/StanfordCPPLib -L/Users/myName/Downloads/CS106B/palindrome/StanfordCPPLib palindrome.cpp -lStanfordCPPLib

【讨论】:

现在可以编译了。但是我收到一条警告说“忽略文件/Users/lihang/Downloads/CS106B/palindrome/StanfordCPPLib/libStanfordCPPLib.a,文件是为存档而构建的,它不是被链接的架构(x86_64):/Users/lihang/Downloads/CS106B /palindrome/StanfordCPPLib/libStanfordCPPLib.a”我会弄清楚的。非常感谢。 警告说该库是为 x86(32 位)机器构建的。您的机器是 64 位的,因此不能使用为 32 位编译的二进制文件。您要么自己编译库形成源代码,要么获得正确的可执行文件 那是有线的,因为我可以在我的 Xcode 上运行这个程序。 那么,您的系统中可能安装了 32 位库。祝你好运!

以上是关于通过 g++ 链接到外部静态库的主要内容,如果未能解决你的问题,请参考以下文章

gcc/g++实战之动态链接库与静态链接库编写

g++ 编译动态链接库和静态链接库

Linux上静态库和动态库的编译和使用

静态链接到 pion 网络库

MFC 静态链接未解析的外部符号

Linux 静态链接库和动态连接库