[英]How can I use C++ STL containers in the implementation file of a C library?
假设我希望在我希望C程序链接到的库的实现中使用C ++ STL容器...
我的示例标题是
/* 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
我尝试第二组编译命令时得到的错误是我们非常熟悉的那些非常长的错误。 一个例子是
./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编译和链接我的示例应用程序代码到共享对象库。 这可能吗? 如果是这样,那么我提供的代码/命令需要进行哪些更改?
问题是你实际上并没有创建共享库。 您正在创建一个目标文件,并将其命名为共享库。
gcc / g ++的-c
选项仅表示执行编译阶段。 这导致libmynums.so
是一个目标文件。 这就是为什么你能够通过g ++而不是gcc链接到它的原因。
在编译mynums.cpp
时删除-c
选项,您将获得一个共享库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.