在 MacOS 上编译 C/C++ 代码

Posted

技术标签:

【中文标题】在 MacOS 上编译 C/C++ 代码【英文标题】:Compiling C/C++ code on MacOS 【发布时间】:2014-09-14 21:41:21 【问题描述】:

我有一个在 Linux 上启动的 C/C++ 项目,现在我想将它移植到 MacOS。我面临的问题如下:

我的源代码链接到 C 库(@​​987654321@ 的 abc 工具)并使用该库中的头文件。在 Linux 上编译时一切顺利,但在 MacOS 上编译时往往会出现问题。我得到的错误如下:

abc/src/misc/vec/vecPtr.h:895:33: error: too many arguments to function call, expected 0, have 2

这主要是由于两个系统上处理函数指针的方式。正如我从在线搜索中了解到的那样,在 C 中,带有空括号 () 的函数指针被认为具有可变数量的参数,而在 C++ 中并非如此。似乎 Linux 上的 g++ 能够正确编译此类代码,而在 MacOS 上却失败了。

任何人都可以就这个问题提供一些见解吗?

谢谢

【问题讨论】:

似乎您正在尝试编译旨在使用 C++ 编译器编译为 C 的代码。在相关头文件中的内容周围使用extern "C" ... 可能会起作用 - 或者使用 gcc 而不是 g++。 你用的是什么编译器?你是如何调用它的? 我正在使用带有隐式规则的 makefile。我尝试将 CXX 设置为 g++,将 CC 设置为 gcc,但没有成功。我也尝试将它们保留为默认系统值,但这也没有用。 【参考方案1】:

库正在声明函数指针参数,如下所示:

int (*Vec_PtrSortCompare)()

然后像这样调用它们:

Vec_PtrSortCompare(p->pArray+i, p->pArray+k-1)

在 C 语言中,具有空参数列表的函数声明符不指定它需要多少个参数。因此,您可以合法地将任意数量的参数传递给这样的函数。但是,此类“可变参数”函数已被弃用。

然而,在 C++ 中,具有空参数列表的函数声明器指定该函数采用零参数。

这种差异意味着您不能使用 C++ 编译器编译这样的头文件。您有两个选择:您可以只使用 C 编译器使用此头文件编译程序的各个部分,并创建一个库或一组目标文件,然后使用 C++ 编译器编译程序的其余部分(假设您有 C++ 部分)。

或者,您可以修复函数声明。从上下文来看,这些函数似乎应该声明为

int (*Vec_PtrSortCompare)(const void **a, const void **b)

(在适当的 C++ 中,这将是一个模板函数,以避免必须使用 void *;但是,C 没有模板。)

【讨论】:

谢谢!我终于不得不手动进行您建议的编辑以使其正常工作。

以上是关于在 MacOS 上编译 C/C++ 代码的主要内容,如果未能解决你的问题,请参考以下文章

在 macOS 上编译 XDR 时出现问题(RPC types.h 问题)

在 mac os 上编译 dlib

在 macOS 10.15.6 上编译 Apache ORC 时出错

在MacOS系统上编译OpenJDK12并使用CLion调试

C++ 在 Mac OS X 上编译代码并在 Linux x86 上运行

macOS 上编译 Dynamips