Как я могу использовать контейнеры C ++ STL в файле реализации библиотеки C? - PullRequest
0 голосов
/ 28 мая 2018

Скажем, я хочу использовать контейнеры C ++ STL в реализации библиотеки, с которой я хочу связать программы на C ...

Мой пример заголовка

/* mynums.h */
#ifndef MY_NUMS
#define MY_NUMS

#ifdef __cplusplus
extern "C" {
#endif

void append_num(int num);
void print_nums();

#ifdef __cplusplus
}
#endif

#endif

И мой примерФайл реализации

/* mynums.cpp */
#include "mynums.h"
#include <vector>

using std::vector;

vector<int> nums;

void append_num(int num)
{
    nums.push_back(num);
}

void print_nums()
{
    for (int i = 0; i < nums.size(); i++)
    {
        printf("%d, ", nums[i]);
    }
    printf("\n");
}

Мое приложение выглядит как

/* app.c */
#include "mynums.h"

int main()
{
    append_num(1);
    append_num(2);
    append_num(3);
    print_nums();

    return 0;
}

И мои команды для компиляции это

# Compiles and runs
g++ -c -fpic -shared -std=c++0x -o libmynums.so mynums.cpp
g++ -L. -lmynums -o app app.c

# Library compiles, but the application fails
g++ -c -fpic -shared -std=c++0x -o libmynums.so mynums.cpp
gcc -L. -lmynums -o app app.c

Ошибки, которые я получаю при попытке второйнабор команд компиляции - это те очень длинные ошибки stl, с которыми мы, о-о, так хорошо знакомы.Один пример:

./libmynums.so" In function 'void std:vector<int, std::allocator<int> >::_M_emplace_back_aux<int const&>(int const &)':
mynums.cpp:(.text._ZNSt6vectorIiSaIiEE19_M_emplace_back_auxIIRKiEEEvDpOT_[_ZNSt6vectorIiSaIiEE19_M_emplace_back_auxIIRKiEEEvDpOT_]+0x15d): undefined reference to '__cxa-begin_catch'

Я хочу иметь возможность скомпилировать и связать код моего примера приложения с библиотекой общего объекта с помощью gcc.Это возможно?Если да, то какие изменения необходимы для моего предоставленного кода / команд?

1 Ответ

0 голосов
/ 28 мая 2018

Проблема в том, что вы на самом деле не создаете общую библиотеку.Вы создаете объектный файл и называете его так, как будто это общая библиотека.

Опция -c для gcc / g ++ означает только выполнение этапа компиляции.В результате libmynums.so является объектным файлом.Вот почему вы можете ссылаться на него через g ++, но не через gcc.

Удалите параметр -c при компиляции mynums.cpp, и вы получите общую библиотеку.

...