在 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 问题)
在 macOS 10.15.6 上编译 Apache ORC 时出错
在MacOS系统上编译OpenJDK12并使用CLion调试