Скажем, я хочу использовать контейнеры 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.Это возможно?Если да, то какие изменения необходимы для моего предоставленного кода / команд?