0

因此,我一直致力于连接散列一个简单的应用程序,包括 C++ 和 Objective-C,以证明一些概念并尝试学习一些东西。

这是我现在的位置,我的命令(正在运行,并在更改时重新运行)是

$ autoreconf -vis && make clean && ./configure && make && ./src/greetings

请注意,我希望它会在我完成后运行,这是一个简短的文件列表:

$查找。| ack '\.(?:cpp|mm|h)$'
./src/darwin/greet.cpp
./src/darwin/greeting.h
./src/darwin/greeting.mm
./src/greet.h
./src/main.cpp
./src/mingw32/greet.cpp
./src/mingw32/greet.h

完整的文件都可以在 Github 的 Gist 中找到。

而不是专门混合语言的问题(我什至没有做到那么远) - 我似乎在编译器上绊倒了没有认识到这是Objective-C(或ObjecC++) - 因此,我的 autoconf 文件在这个 gist中。

这里有完整的错误输出,也在 Gist中。

这是一个示例:

在 /usr/include/c++/4.2.1/iosfwd:48 包含的文件中,
                 来自/usr/include/c++/4.2.1/ios:43,
                 来自 /usr/include/c++/4.2.1/ostream:45,
                 来自/usr/include/c++/4.2.1/iostream:45,
                 来自达尔文/greet.cpp:10:
/usr/include/c++/4.2.1/bits/stringfwd.h:48:错误:带有 C 链接的模板
/usr/include/c++/4.2.1/bits/stringfwd.h:51:错误:带有 C 链接的模板
/usr/include/c++/4.2.1/bits/stringfwd.h:54:错误:带有 C 链接的模板
/usr/include/c++/4.2.1/bits/stringfwd.h:58:错误:带有 C 链接的模板特化
/usr/include/c++/4.2.1/bits/stringfwd.h:63:错误:带有 C 链接的模板特化
在 /usr/include/c++/4.2.1/iosfwd:49 包含的文件中,
                 来自/usr/include/c++/4.2.1/ios:43,
                 来自 /usr/include/c++/4.2.1/ostream:45,
                 来自/usr/include/c++/4.2.1/iostream:45,
                 来自达尔文/greet.cpp:10:
4

2 回答 2

0

通过使用 zip 文件,我推荐以下内容:

在语言边界上使用纯 C 接口。这将避免 automake 不存在的 Objective-C++ 支持。使用

#ifdef __cplusplus
extern "C"
#endif

对头文件进行技巧以确保 C++ 编译器将生成 C 函数,并且 Objective-C 编译器可以处理头文件。这将使 Objective-C 代码可以调用您的接口。

像以前一样设置您的源代码树:公共代码在 中src/,操作系统特定代码在src/darwinsrc/msdos(:P) 中,src/win32等等。列出 中EXTRA_foo_SOURCES的所有来源Makefile.am

configure.ac中,测试您正在编译的平台并用于AM_CONDITIONAL设置Makefile.am可以读取的标志(您已经正确完成了此操作)。

Makefile.am中,使用条件来包含正确的附加来源:

if OS_DARWIN
  foo_SOURCES += darwin/foo.m darwin/bar.h darwin/baz.m
  foo_LDFLAGS = -Wl,-framework,Foundation
endif

请注意,由于选择链接器的方式,将尝试使用 C++ 链接。用于制作 Objective-C 代码链接的附加链接器标志需要位于foo_LDFLAGS.

在您的情况下发生的情况如下: 在greet.h中,您没有声明void greet();extern "C"。这意味着在main.cpp编译时,它期望 avoid greet()具有 C++ 链接(在我的例子中,符号是greet)。darwin/greet.cpp已编译并void greet()声明为extern "C",因此它生成了 C 版本(带有符号_greet)。然后链接失败,因为链接器需要一个greet符号,但没有提供该符号。

于 2010-09-26T04:58:06.280 回答
0

您的“带有 C 链接的模板”问题是由于块#include <iostream>内部造成的extern "C"。尝试这样的事情:

#include <CoreFoundation/CoreFoundation.h>
#include <iostream>

/* In a #ifdef __cplusplus block, if you want. */
extern "C"
void greet() {
  /* ... */
}

这将使greet()具有 C 链接,而不会误解标题。

于 2010-09-22T06:14:45.950 回答