在OSX上创建C++共享库

18

我刚开始学习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),以便我可以轻松地跨平台编译。任何提示吗?


3
虽然与主题半相关,但是将 int 转换为由 01 构成的字符串更容易,使用 std::bitsetstd::string to_binary(int v) { return std::bitset<sizeof(int)*CHAR_BIT>(v).to_string();} - Jerry Coffin
您无需将libuki.so安装在您的$PATH中,只需将其放在您的$LD_LIBRARY_PATH中即可(例如:可能是在您的$HOME/lib/目录下)。 - Basile Starynkevitch
2个回答

33

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

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

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

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

安装完成后,您可能需要设置libutils.dylib上的install_name - jww

11

您发布的链接中使用了 C 语言和 C 编译器。由于您正在构建 C++ 代码:

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

在 Linux 上,您确实希望至少传递 -fPIC - Basile Starynkevitch
4
在Mac OS X上,你应该使用-dynamiclib选项,而不是-shared - linuxbuild
@linuxbuild,它们有什么区别?(我在谷歌中途着陆到这里) - monkey0506
@monkey0506 -dynamiclib:当传递此选项时,GCC使用Darwin libtool命令进行链接,生成动态库而不是可执行文件。 - linuxbuild
@linuxbuild “GCC在链接时生成动态库而不是可执行文件”这意味着如果使用“-shared”而不是“-dynamiclib”(在OS X上),那么GCC将生成一个可执行文件,而不是动态库?我想知道它们之间的区别是什么,因为根据我的经验,它们没有任何区别。 - monkey0506
@monkey0506 我有同样的观察,但区别可能在库链接器上,例如 -dynamiclib 将使用 macOS 特定的 libtool,但我不确定 gcc 对 -shared 做了什么。 - bric3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接