<bdo id='AodYd'></bdo><ul id='AodYd'></ul>

    1. <i id='AodYd'><tr id='AodYd'><dt id='AodYd'><q id='AodYd'><span id='AodYd'><b id='AodYd'><form id='AodYd'><ins id='AodYd'></ins><ul id='AodYd'></ul><sub id='AodYd'></sub></form><legend id='AodYd'></legend><bdo id='AodYd'><pre id='AodYd'><center id='AodYd'></center></pre></bdo></b><th id='AodYd'></th></span></q></dt></tr></i><div id='AodYd'><tfoot id='AodYd'></tfoot><dl id='AodYd'><fieldset id='AodYd'></fieldset></dl></div>
    2. <tfoot id='AodYd'></tfoot>
      <legend id='AodYd'><style id='AodYd'><dir id='AodYd'><q id='AodYd'></q></dir></style></legend>

      <small id='AodYd'></small><noframes id='AodYd'>

      我可以在 C 程序中使用在 C++ 中创建的共享库吗?

      Can I use shared library created in C++ in a C program?(我可以在 C 程序中使用在 C++ 中创建的共享库吗?)
      • <legend id='xqjUh'><style id='xqjUh'><dir id='xqjUh'><q id='xqjUh'></q></dir></style></legend>

            <tbody id='xqjUh'></tbody>

              <i id='xqjUh'><tr id='xqjUh'><dt id='xqjUh'><q id='xqjUh'><span id='xqjUh'><b id='xqjUh'><form id='xqjUh'><ins id='xqjUh'></ins><ul id='xqjUh'></ul><sub id='xqjUh'></sub></form><legend id='xqjUh'></legend><bdo id='xqjUh'><pre id='xqjUh'><center id='xqjUh'></center></pre></bdo></b><th id='xqjUh'></th></span></q></dt></tr></i><div id='xqjUh'><tfoot id='xqjUh'></tfoot><dl id='xqjUh'><fieldset id='xqjUh'></fieldset></dl></div>

                <bdo id='xqjUh'></bdo><ul id='xqjUh'></ul>
                <tfoot id='xqjUh'></tfoot>

                <small id='xqjUh'></small><noframes id='xqjUh'>

                本文介绍了我可以在 C 程序中使用在 C++ 中创建的共享库吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我正在使用 C 创建程序.但是,我需要使用许多具有仅用于 C++ 的 API 的库.那么,我可以在 C++ 中创建一个共享对象,然后使用 C 访问它的功能吗?

                I am creating programs using C. However, I require to use a lot of libraries that have API's only for C++. So, is it possible that I can create a shared object in C++ and then access its functionality using C?

                1. 我将传递和返回的唯一数据是与 C 兼容的数据类型.
                2. 此处无法转换或迁移到 cpp.

                如果无法将这些代码接口,我该如何从 C++ 代码到 C 代码获取信息?我尝试从 C 调用 C++ 函数,但是当我包含 <string> 时,在链接过程中出现错误.所以当我从 C 调用 C++ 函数时,我应该只使用与 C 编译器兼容的代码吗?

                If it is not possible to interface these codes, how do I get information from C++ code to C code? I tried calling C++ functions from C, but I get errors during linking when I include <string>. So when I call C++ functions from C, should I only use that code which will be C compiler compatible?

                #ifndef CPPFILE_H
                #define CPPFILE_H
                    #ifdef __cplusplus
                    extern "C" {
                    #endif
                
                    extern int myfunction(const char *filename);
                
                   #ifdef __cplusplus
                   }
                   #endif
                #endif
                

                C++ 文件 cppfile.cpp

                #include "cppfile.hpp"
                #include <string>
                int myfunction(const char *filename) {
                    String S(filename);
                    return 0;
                }
                

                C 文件 cmain.c

                #include "cppfile.hpp"
                int main(int argc, char **argv)
                {
                     int i = myfunction(argv[1]);
                     printf("%d
                ", i);
                     return 0;
                }
                

                编译:

                gcc -c cmain.c
                g++ -fPIC -shared -o cppfile.so cppfile.cpp
                

                推荐答案

                你想要更像这样的东西(这里我将使用一个更有意义的例子):

                You want something more like this (and here I will use a slightly more meaningful example):

                #ifndef ANIMAL_H
                #define ANIMAL_H
                
                #ifdef __cplusplus
                class Animal {
                public:
                    Animal() : age(0), height(0) {}
                    Animal(int age, float height) : age(age), height(height) {}
                    virtual ~Animal() {}
                
                    int   getAge();
                    void  setAge(int new_age);
                
                    float getHeight();
                    void  setHeight(float new_height);
                
                private:
                    int age;
                    float height; // in metres!
                };
                #endif /* __cplusplus */
                
                #ifdef __cplusplus
                extern "C" {
                #endif
                    struct animal; // a nice opaque type
                
                    struct animal *animal_create();
                    struct animal *animal_create_init(int age, float height);
                    void           animal_destroy(struct animal *a);
                
                    void           animal_setage(struct animal *a, int new_age);
                    void           animal_setheight(struct animal *a, float new_height);
                    int            animal_getage(struct animal *a);
                    float          animal_getheight(struct animal *a);
                #ifdef __cplusplus
                }
                #endif
                
                #endif /* ANIMAL_H */
                

                C++ 动物实现文件-animal.cpp

                #include "animal.h"
                #define TO_CPP(a) (reinterpret_cast<Animal*>(a))
                #define TO_C(a)   (reinterpret_cast<animal*>(a))
                
                void  Animal::setAge(int new_age) { this->age = new_age; }
                int   Animal::getAge() { return this->age; }
                void  Animal::setHeight(float new_height) { this->height = new_height; }
                float Animal::getHeight() { return this->height; }
                
                animal *animal_create() {
                    animal *a = TO_C(new Animal);
                    return a;
                }
                
                animal *animal_create_init(int age, float height) {
                    animal *a = TO_C(new Animal(age, height));
                    return a;
                }
                
                void animal_destroy(animal *a) {
                    delete TO_CPP(a);
                }
                
                void animal_setage(animal *a, int new_age) {
                    TO_CPP(a)->setAge(new_age);
                }
                
                void animal_setheight(animal *a, float new_height) {
                    TO_CPP(a)->setHeight(new_height);
                }
                
                int animal_getage(animal *a) {
                    TO_CPP(a)->getAge();
                }
                
                float animal_getheight(animal *a) {
                    TO_CPP(a)->getHeight();
                }
                

                C 客户端代码 - main.c

                #include "animal.h"
                #include <stdio.h>
                
                int main()
                {
                    // 6'0" 25yo (perhaps a human? :P)
                    struct animal *a = animal_create(25, 1.83); 
                
                    animal_setage(a, 26); // birthday
                    printf("Age: %d
                Height: %f", animal_getage(a), animal_getheight(a));
                
                    animal_destroy(a);
                    return 0;
                }
                

                C++ 客户端代码 - main.cpp

                #include "animal.h"
                #include <iostream>
                
                int main()
                {
                    // 6'0" 25yo (perhaps a human? :P)
                    Animal* a = new Animal(25, 1.83);
                    a->setAge(26); // birthday
                    std::cout << "Age:    " << a->getAge() << std::endl;
                    std::cout << "Height: " << a->getHeight();
                
                    delete a;
                    return 0;
                }
                

                因此,当您编译库时,您使用 C++ 编译器编译 animal.cpp.然后您可以使用 C 代码链接到它,并使用 animal_xxx 函数.

                So when you compile the library, you compile animal.cpp with a C++ compiler. You can then link to it with C code, and use the animal_xxx functions.

                注意struct animalAnimal 的使用.Animal 是一个普通的 C++ 类型.这正是它的样子.struct animal 另一方面,是一种不透明"类型.这意味着您的 C 程序可以看到它在那里,并且可以拥有一个,但它不知道里面有什么.它只知道它有一个接受 struct animal* 的函数.

                Note the use of struct animal and Animal. Animal is a normal C++ type. It's exactly what it looks like. struct animal, on the other hand, is an "opaque" type. That means that your C program can see it's there, and can have one, but it doesn't know what is inside it. All it knows is that it has a function that takes a struct animal*.

                在一个真正的库中,你会希望有内存分配的自定义点.因此,假设这是库 libjungle,您可能至少需要具有合理默认值的 jungle_setmallocjungle_setfree.然后,您可以在 libjungle 的 C++ 代码中设置全局 newdelete 以使用这些用户定义的函数.

                In a real library you will want to have customisation points for memory allocation. So assuming this is the library libjungle, you probably want at least jungle_setmalloc and jungle_setfree with sensible defaults. You can then set up the global new and delete in libjungle's C++ code to use these user-defined functions.

                这篇关于我可以在 C 程序中使用在 C++ 中创建的共享库吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                Is Type(::x); valid?(是类型(::x);有效的?)
                Difference between an inline function and static inline function(内联函数和静态内联函数的区别)
                Compilation fails randomly: quot;cannot open program databasequot;(编译随机失败:“无法打开程序数据库)
                Too many initializers error for a simple array in bcc32(bcc32 中的简单数组的初始值设定项过多错误)
                No Member named stoi in namespace std(命名空间 std 中没有名为 stoi 的成员)
                Error using a constexpr as a template parameter within the same class(在同一个类中使用 constexpr 作为模板参数时出错)

                    • <bdo id='iSTsq'></bdo><ul id='iSTsq'></ul>
                      <tfoot id='iSTsq'></tfoot>
                    • <i id='iSTsq'><tr id='iSTsq'><dt id='iSTsq'><q id='iSTsq'><span id='iSTsq'><b id='iSTsq'><form id='iSTsq'><ins id='iSTsq'></ins><ul id='iSTsq'></ul><sub id='iSTsq'></sub></form><legend id='iSTsq'></legend><bdo id='iSTsq'><pre id='iSTsq'><center id='iSTsq'></center></pre></bdo></b><th id='iSTsq'></th></span></q></dt></tr></i><div id='iSTsq'><tfoot id='iSTsq'></tfoot><dl id='iSTsq'><fieldset id='iSTsq'></fieldset></dl></div>

                        <tbody id='iSTsq'></tbody>

                      • <legend id='iSTsq'><style id='iSTsq'><dir id='iSTsq'><q id='iSTsq'></q></dir></style></legend>

                          <small id='iSTsq'></small><noframes id='iSTsq'>