c++ - 如何在 Eclipse 中使用动态库?

标签 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文件夹下用上面生成的动态lib创建了一个工程:

Alt text
(来源:p.im9.eu)

相应地调整了 -L 和 -l 设置:

Alt text
(来源:p.im9.eu)

得到这些错误:

Alt text
(来源:p.im9.eu)

我尝试过的其他事情:

Alt text
(来源:p.im9.eu)

Alt text
(来源: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/

相关文章:

c - Eclipse 中包含路径问题 : probably Indexer

c++ - 如何在Qt上使用TLS协议(protocol)?

java - 在 Eclipse 中运行 Android 项目时出现 IOException

C++ 对象指针问题

java - 在远程或虚拟机上启动和调试 Java 应用程序

java - Android eclipse java 改变 map View

c++ - 在 Eclipse 中编译 C++?

c++ - 二进制永远不会构建

c++ - 使用 xerces 链接 DLL 会给出 undefined symbol

c++ - 使用 bit_cast 在 C++20 中将整数转换为 GLvoid* 是否有效?