这是我用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文件夹中创建了一个带有上面生成的动态库的项目:
Alt text http://p.im9.eu/host1407192907-397806.jpg
相应调整-L和-l设置:
Alt text http://p.im9.eu/host1407192977-249565.jpg
发现了这些错误:
Alt text http://p.im9.eu/host1407192948-729484.jpg
我尝试过的其他事情:
Alt text http://p.im9.eu/host1407193062-324992.jpg
Alt text http://p.im9.eu/host1407193791-743995.jpg
错误保持不变。我现在几乎想把头靠在墙上。我应该开始学习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
答案 0 :(得分:1)
<强> EDIT2:强> 它让我觉得你在Mac上,我记得有一些关于库加载的搞笑。因此,有几个原因导致您找不到图像。以下仍然适用,但还有另一个原因可能是失败。见dyld: Library not loaded: libqscintilla2.5.dylib
我不知道Mac上的eclipse是否与GCC一起发布,或者它是否只在该平台上运行,但是尝试将DYLD_LIBRARY_PATH设置为快速测试,看看它是否只是Mac Special。 https://superuser.com/questions/282450/where-do-i-set-dyld-library-path-on-mac-os-x-and-is-it-a-good-idea
修改强> 好吧它编译!现在我们遇到链接错误。这个实际上很有趣,并不是我下面列出的“常见”(即Unresolved Symbols)。此错误“找不到图像”通常表示链接器找到库,但无法使用它,因为它是以不兼容的方式编译的。
为什么它采用任何不兼容的格式?欢迎使用我讨厌缺少的C ++的一个特性,其中一个原因就是每个库都提供了一个C接口而不是C ++接口。
C ++不提供稳定的ABI(应用程序二进制接口)。这意味着使用不同的编译器编译的库(甚至只是不同版本的相同的编译器可能不一起工作.99 / 100他们将完全拒绝链接/工作,但即使他们确实联系起来,你也会变得非常奇怪,难以追踪错误等等。
这是tl; dr:如果你希望你的静态库是C ++(我推荐)并且有一个C ++接口,你需要确保使用完全相同的编译器版本来编译你的应用程序和静态库。最简单的方法是让eclipse构建静态库和应用程序。
随着Herb Sutter提出创建平台定义的C ++ ABI的建议,这有望随着下一版C ++而改变。
<强>原始强> 您需要将包含calc_mean.h的文件夹添加到“附加包含”以进行c ++生成。您可以将include语句视为在该确切行上剪切和粘贴文件的内容。错误是说“嘿,我去寻找一个名为calc_mean.h的文件,但找不到它。”您需要链接库和标题(因此main.cpp知道函数)
如果说“未解决的符号”是错误的,那么符号在你的库中,那么你就会知道你已经搞砸了添加库或库路径(-L)。
Cmake是一个很好的工具,但很高兴知道如何使用ide。基本步骤(添加库名,添加库路径,添加包含库头的目录)在eclipse,netbeans,visual studio,xcode等中是相同的)