代码之家  ›  专栏  ›  技术社区  ›  Lee Hambley

C++与Objy-C混合(疑似MutoKaY问题)

  •  0
  • Lee Hambley  · 技术社区  · 14 年前

    所以,我一直在努力连接一个简单的应用程序,包括C++和ObjuleC,来证明一些概念,并尝试学习一些东西。

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

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

    $ find . | 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
    

    所有的文件,都可以在这里找到 Gist at Github .

    Objective-C (或 ObjecC++ )-因此,我的autoconf文件 this gist .

    有完整的错误输出 here, also in a Gist .

    下面是一个示例:

    In file included from /usr/include/c++/4.2.1/iosfwd:48,
                     from /usr/include/c++/4.2.1/ios:43,
                     from /usr/include/c++/4.2.1/ostream:45,
                     from /usr/include/c++/4.2.1/iostream:45,
                     from darwin/greet.cpp:10:
    /usr/include/c++/4.2.1/bits/stringfwd.h:48: error: template with C linkage
    /usr/include/c++/4.2.1/bits/stringfwd.h:51: error: template with C linkage
    /usr/include/c++/4.2.1/bits/stringfwd.h:54: error: template with C linkage
    /usr/include/c++/4.2.1/bits/stringfwd.h:58: error: template specialization with C linkage
    /usr/include/c++/4.2.1/bits/stringfwd.h:63: error: template specialization with C linkage
    In file included from /usr/include/c++/4.2.1/iosfwd:49,
                     from /usr/include/c++/4.2.1/ios:43,
                     from /usr/include/c++/4.2.1/ostream:45,
                     from /usr/include/c++/4.2.1/iostream:45,
                     from darwin/greet.cpp:10:
    
    2 回复  |  直到 14 年前
        1
  •  0
  •   Jack Kelly    14 年前

    从使用zip文件开始,我推荐以下内容:

    #ifdef __cplusplus
    extern "C"
    #endif
    

    把头上的技巧以确保C++编译器将生成C函数,Objto-C编译器可以处理标题。这将使Objective-C代码能够调用您的接口。

    像以前一样设置源代码树:中的公共代码 src/ src/darwin , src/msdos (:P), src/win32 等等。列出中的所有源 EXTRA_foo_SOURCES 在里面 Makefile.am .

    configure.ac ,测试编译和使用的平台 AM_CONDITIONAL 生成文件.am 可以阅读(你已经正确地完成了)。

    生成文件.am ,使用条件包含正确的附加源:

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

    注意,因为 how the linker is chosen foo_LDFLAGS .

    你的情况是这样的:在 greet.h ,您没有申报 void greet(); 作为 extern "C" . 这意味着当 main.cpp 是编译的,它需要一个 void greet() 它有C++链接(在我的例子中,符号是 greet ). darwin/greet.cpp 已编译并具有 声明为 ,所以它产生了一个C版本(带有符号 _greet ). 链接失败,因为链接器需要 打招呼 但没有任何规定。

        2
  •  0
  •   Jack Kelly    14 年前

    您的“带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链接,没有标题被曲解。