无法在C程序中正确使用C ++静态库带有CLion的Mingw64

问题描述

我正在尝试制作一个简单的C ++静态库以与C程序一起使用。我的文件如下。

// strarr.h
#pragma once

#include <stdio.h>

#ifdef __cplusplus
extern "C"
{
#endif
    typedef char **str_arr;
    str_arr new_str_arr(size_t size);
    void del_str_arr(str_arr arr,size_t size);
    str_arr resize_str_arr(str_arr arr,size_t arr_size,size_t new_size);
    size_t add_str(str_arr arr,size_t index,char *str);
#ifdef __cplusplus
}
#endif

void print_arr(str_arr arr,size_t size);

// strarr.c
#include "strarr.h"

#include <stdlib.h>

str_arr new_str_arr(size_t size)
{
    str_arr arr = (str_arr)calloc(size,sizeof(char*));
    if (arr == NULL) return NULL;

    for (size_t i = 0; i < size; i++)
    {
        arr[i] = (char*)calloc(1,sizeof(char));
        if (arr[i] == NULL) return NULL;
    }

    return arr;
}

void del_str_arr(str_arr arr,size_t size)
{
    for (size_t i = 0; i < size; i++)
    {
        free(arr[i]);
        arr[i] = NULL;
    }

    free(arr);
    arr = NULL;
}

str_arr resize_str_arr(str_arr arr,size_t new_size)
{
    return NULL;
}

size_t add_str(str_arr arr,char* str)
{
    return 0;
}

// strarr.cpp
#include "strarr.h"

#include <iostream>

void print_arr(str_arr arr,size_t size)
{
    for (size_t i = 0; i < size; i++)
        std::cout << i << ": " << arr[i] << std::endl;
}

我正在使用以下命令手动编译

g++ -c strarr.c -o bin/static/strarr.o
g++ -lstdc++ -c strarr.cpp -o bin/static/strarrcpp.o
ar rvs bin/static/libqbb.a bin/static/strarr.o bin/static/strarrcpp.o

我已将成功构建的库导入C项目中,但是在构建它时会吐出此错误

====================[ Build | all | Debug ]=====================================
C:\Users\AGSoldier\AppData\Local\JetBrains\ToolBox\apps\CLion\ch-0\202.6397.106\bin\cmake\win\bin\cmake.exe --build "D:\AGSoldier\Sidereal Works\Qbb\qbb_test\build" --target all -- -j 3
Scanning dependencies of target qbb_test
[ 50%] Building C object CMakeFiles/qbb_test.dir/main.c.obj
[100%] Linking C executable qbb_test.exe
CMakeFiles\qbb_test.dir/objects.a(main.c.obj): In function `main':
D:/AGSoldier/Sidereal Works/Qbb/qbb_test/main.c:468: undefined reference to `print_arr'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[2]: *** [CMakeFiles\qbb_test.dir\build.make:107: qbb_test.exe] Error 1
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:95: CMakeFiles/qbb_test.dir/all] Error 2
mingw32-make.exe: *** [Makefile:103: all] Error 2

我做错了什么?我搜索了几个小时,没有任何结果。

解决方法

您需要放置声明

implementation "org.springframework.boot:spring-boot-starter-undertow"
如果要从* .c文件调用该函数,请

进入 extern C 范围。