【问题标题】:Creating shared libraries in C++ for OSX在 C++ 中为 OSX 创建共享库
【发布时间】:2012-12-19 20:13:54
【问题描述】:

我刚开始使用 C++ 进行编程,我意识到我不得不一遍又一遍地编写相同的代码(主要是实用程序函数)。

所以,我正在尝试创建一个共享库并将其安装在 PATH 中,以便我可以在需要时使用实用程序函数。

这是我到目前为止所做的:-

创建一个文件utils.h,内容如下:-

#include<iostream>
#include<string>
std::string to_binary(int x);

创建一个文件utils.cpp,内容如下:-

#include "utils.h"

std::string to_binary(int x) {
  std::string binary = "";
  while ( x > 0 ) {
    if ( x & 1 ) binary += "1";
    else binary += "0";
    x >>= 1;
  }
  return binary;
}

按照此处提到的步骤进行操作:- http://www.techytalk.info/c-cplusplus-library-programming-on-linux-part-two-dynamic-libraries/

  • 创建库对象代码:g++ -Wall -fPIC -c utils.cpp

但由于上面的链接是针对 Linux 的,它在 OSX 上并不真正工作。有人可以建议阅读资源或建议我如何在 OSX 机器上编译和设置这些对象的路径吗?

另外,我猜应该有一种方法可以使这个跨平台(即编写一组指令(bash 脚本)或 Makefile),以便我可以用来跨平台轻松编译它。有什么提示吗?

【问题讨论】:

  • 只是半相关的,但是通过std::bitset 将int 转换为0s 和1s 的字符串更容易:std::string to_binary(int v) { return std::bitset&lt;sizeof(int)*CHAR_BIT&gt;(v).to_string();}
  • 您不需要在您的$PATH 中安装您的libuki.so,而只需在您的$LD_LIBRARY_PATH 中(例如,可能在您的$HOME/lib/ 中)

标签: c++ linux macos stl shared-libraries


【解决方案1】:

使用-dynamiclib 选项在 OS X 上编译动态库:

g++ -dynamiclib -o libutils.dylib utils.cpp

然后在您的客户端应用程序中使用它:

g++ client.cpp -L/dir/ -lutils

【讨论】:

  • 安装后您可能应该在libutils.dylib 上设置install_name
【解决方案2】:

您发布的链接使用 C 和 C 编译器。由于您正在构建 C++:

g++ -shared -o libYourLibraryName.so utils.o

【讨论】:

  • 你真的很想通过-fPIC 至少在 Linux 上
  • 你应该在 OS X 上使用-dynamiclib 选项而不是-shared。
  • @linuxbuild 有什么区别? (在谷歌搜索中登陆这里)
  • @monkey0506 -dynamiclib:当传递此选项时,GCC 在链接时使用 Darwin libtool 命令生成动态库而不是可执行文件。
  • @linuxbuild "GCC 在链接时生成动态库而不是可执行文件" 所以你说如果使用 "-shared" 而不是 "-dynamiclib" (在 OS X 上) 那么 GCC 将生成可执行文件,而不是动态库?我在问有什么区别,因为根据我的经验,没有任何区别。
猜你喜欢
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多