如何在eclipse中使用动态库?

时间:2014-08-04 23:11:35

标签: c++ eclipse eclipse-cdt dynamic-linking

这是我用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

1 个答案:

答案 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等中是相同的)