admin管理员组

文章数量:1663034

1.问题描述

问题背景:
  在 Mac 中,想将 C++ 程序编译成一个动态库,使用 cc 进行编译(有些时候编译简单的 C++ 程序也遇到过)。
使用命令如下:

cc -fPIC -shared -o encrypt_for_python.so encrypt_for_python.cpp -L/path/to/lib -I/path/to/include -std=c++11

结果:

Undefined symbols for architecture arm64:
  "___gxx_personality_v0", referenced from:
      _decrypt_data_python in encrypt_for_python-6def14.o
ld: symbol(s) not found for architecture arm64

2.解决办法

  之前在编译 C++ 程序的时候,也遇到过这种情况,但是没有找到解决方案。程序没有语法错误,但是编译会报错。
  上述情形,在使用的程序是 C++ 而不是 C 这一背景下,通常可以使用以下方式解决:

(1) 在编译命令中添加 -lstdc++ 参数,引入 C++ 的标准库。

  如:

cc -fPIC -shared -o encrypt_for_python.so encrypt_for_python.cpp -L/path/to/lib -I/path/to/include -std=c++11 -lstdc++

(2) 使用 g++ 对程序进行编译。

  如:

g++ -fPIC -shared -o encrypt_for_python.so encrypt_for_python.cpp -L/path/to/lib -I/path/to/include -std=c++11

  通常 Linux 中, cc 只是 gcc 或着 g++ 的一个符号链接,但是在 Mac 中似乎不同。在 Mac 中,如果使用 cc 编译程序,默认使用 C 的标准库,如果想使用 C++ 的标准库,需要在编译命令中添加 -lstdc++。在上述情形中,我的 CPP 文件中使用到了 C++ 中的类,因此在编译的时候,默认选择的 C 标准库是不能满足要求的,就会出现错误。(如果在 C++ 程序中使用的完全是 C 的内容,而非 C++ 特有,编译程序是不会出错的。)

本文标签: 程序symbolsundefinedMacld