这是我用 clang++ 做的一个小例子:
===filename===
calc_mean.cpp
===filename===
===filecontent===
double mean(double a, double b) {
return (a+b) / 2;
}
===filecontent===
===filename===
calc_mean.h
===filename===
===filecontent===
double mean(double, double);
===filecontent===
===filename===
commands.sh
===filename===
===filecontent===
#/usr/bin/env bash
clang++ -c calc_mean.cpp -o calc_mean.o
ar rcs libmean.a calc_mean.o
clang++ -c -fPIC calc_mean.cpp -o calc_mean.o
gcc -shared -W1,-soname,libmean.so.1 -o libmean.so.1.0.1 calc_mean.o
clang++ main.cpp -L. -lmean -o dynamicmain -v
===filecontent===
===filename===
main.cpp
===filename===
===filecontent===
#include <stdio.h>
#include "calc_mean.h"
int main(int argc, char const* argv[])
{
double v1, v2, m;
v1 = 5.0;
v2 = 6.0;
m = mean(v1, v2);
printf("Mean: %f\n", m);
return 0;
}
===filecontent===
它工作得很好。现在转到eclipse,我在libs文件夹下用上面生成的动态lib创建了一个工程:
(来源:p.im9.eu)
相应地调整了 -L 和 -l 设置:
(来源:p.im9.eu)
得到这些错误:
(来源:p.im9.eu)
我尝试过的其他事情:
(来源:p.im9.eu)
(来源:p.im9.eu)
错误保持不变。我现在几乎想用头撞墙。我应该开始学习 cmake 了吗?
更新
我这次也添加了头文件,但是eclipse还是无法解析函数mean
(通过代码分析)。
虽然它编译没有错误,但是当我运行输出二进制文件时,它说:
dyld: Library not loaded: libmean.so
Referenced from: /Users/kaiyin/personal_config_bin_files/workspace/testuselib/Debug/testuselib
Reason: image not found
最佳答案
编辑2: 我突然想到你在 Mac 上,我记得库加载有一些有趣的地方。因此,有几个原因会导致您无法找到图像。以下内容仍然适用,但还有另一个可能失败的原因。参见 dyld: Library not loaded: libqscintilla2.5.dylib
我不知道 Mac 上的 eclipse 是否甚至附带 GCC,或者它是否只在该平台上发出 clang,但尝试将 DYLD_LIBRARY_PATH 设置为快速测试以查看它是否只是 Mac Being Special。 https://superuser.com/questions/282450/where-do-i-set-dyld-library-path-on-mac-os-x-and-is-it-a-good-idea
编辑: 耶它编译!现在我们遇到了链接错误。这个实际上非常有趣,并且不是我在下面列出的“常见”符号(即未解析的符号)。此错误“未找到图像”通常 表示链接器找到 库,但无法使用它,因为它是以不兼容的方式编译的。
为什么它是任何不兼容的格式?欢迎来到我讨厌的 C++ 缺失的一个特性,这也是几乎每个库都提供 C 接口(interface)而不是 C++ 接口(interface)的原因之一。
C++ 不提供稳定的 ABI(应用程序二进制接口(interface))。这意味着使用不同编译器(或者甚至只是同一编译器的不同版本)编译的库可能不能一起工作。99/100 他们会直接拒绝链接/工作,但即使他们确实链接了,你也会变得非常奇怪,很难甚至不可能追踪错误等。
这里是 tl;dr:如果您希望您的静态库是 C++(我推荐)并具有 C++ 接口(interface),您需要确保使用完全相同的编译器版本来编译您的应用程序 和静态库。最简单的方法是让 Eclipse 构建静态库和应用程序。
随着 Herb Sutter 提出了创建平台定义的 C++ ABI 的提案,这有望随着 C++ 的下一个版本而改变。
原文: 您需要将包含 calc_mean.h 的文件夹添加到 C++ 生成的“附加包含”中。您可以将 include 语句视为在该行剪切和粘贴文件的内容。错误是说“嘿,我去寻找一个名为 calc_mean.h 的文件,但找不到它。”您需要链接库 和 header (以便 main.cpp 知道函数)
如果说“未解析的符号”是一个错误,而这些符号在您的库中,那么您就会知道您在添加库或库路径 (-L) 时搞砸了。
Cmake 是一个很好的工具,但很高兴知道如何使用 ide。基本步骤(添加库名、添加库路径、添加包含库头的目录)在eclipse、netbeans、visual studio、xcode等中都是一样的)
关于c++ - 如何在 Eclipse 中使用动态库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25128945/