假设我希望在我希望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

当我尝试第二组编译命令时遇到的错误是我们非常熟悉的那些很长的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编译示例应用程序代码并将其链接到共享库。这可能吗?如果是这样,那么我提供的代码/命令需要进行哪些更改?

最佳答案

问题是您实际上没有在创建共享库。您正在创建一个目标文件,并将其命名为共享库。

gcc/g++的-c选项意味着仅执行编译阶段。这导致libmynums.so是一个目标文件。这就是为什么您可以通过g++而不是gcc链接到它的原因。

编译-c时删除mynums.cpp选项,您将获得一个共享库。

关于c++ - 如何在C库的实现文件中使用C++ STL容器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50556920/

10-11 22:46
查看更多