【发布时间】:2013-10-28 20:49:06
【问题描述】:
在转换到 OS X Mavericks 和 XCode 5.0.1 后,我不能再优雅地将已编译的 C 文件(从 gcc 输出)链接到 C++ 项目(从 g++ 输出)。
我的 makefile 产生的有问题的命令对是:
gcc `pkg-config --cflags glib-2.0` -g -Wall -O3 `pkg-config --cflags flann` -c -o vec.o vec.c
g++ `pkg-config --cflags glib-2.0` -g -Wall -O3 -stdlib=libstdc++ -lstdc++ layoutquality.cpp vec.o `pkg-config --libs glib-2.0` -L/usr/local/Cellar/flann/1.8.4/lib -lflann -o layoutquality
链接器抱怨的对象:
架构 x86_64 的未定义符号: “load_dmat(char const*)”,引用自: _main in layoutquality-I8HOqy.o ld:未找到架构 x86_64 的符号
load_dmat 只是文件 vec.c 中的一个函数。如果我在第一行将gcc 替换为g++,那么一切都可以编译和链接,但是clang 说:
clang:警告:在 C++ 模式下将“c”输入视为“c++”,此行为已弃用
有没有一种无害的、不被弃用的编译和链接方式?在我升级到 OS X Mavericks 和新的命令行工具之前,将g++ 与来自gcc 的目标文件链接在一起工作得很好。任何关于发生了什么变化以及如何前进的见解都会很棒,谢谢。
【问题讨论】:
-
在编译成 C++ 模块的
load_dmat的声明中是否使用extern "C"?如果不是,C++ 编译器会期望一个错误的名称。 -
不,我不知道,它应该去哪里?在标头 vec.h 或源 vec.c 中?不过,我对编辑 vec.* 犹豫不决,因为它已被其他 C 项目使用。
-
在标题中,附上您的声明,如:
extern "C" { void load_dmat(char const*); }。使用#ifdef __cplusplus(如下面的答案)保持 C 项目不受影响。 -
您可能希望将“gcc”替换为“clang”,将“g++”替换为“clang++”,以养成不使用已弃用的符号链接到 clang 的习惯。
-
不要认为这是名称篡改。查看我对@Inspired 的回复
标签: c++ c gcc clang osx-mavericks