Я пытаюсь создать библиотеку c stati, чтобы позволить мне использовать C ++ API в моей C программе. Для начала я пытаюсь вызвать функцию API с именем APIName::Api_init()
; До сих пор я создал библиотеку-оболочку, которая имеет следующее:
c_api.h:
#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif
EXTERNC int apiname_api_init(char const * user_app_name);
EXTERNC void apiname_api_shutdown();
#undef EXTERNC
c_api. cpp:
#include "c_api.h"
#include "../include/apiname/api.h" // Link to header files from API provider
int apiname_api_init(char const * user_app_name) {
return to_return_code(APIName::Api_init(user_app_name));
}
void apiname_api_shutdown() {
return APIName::api_shutdown();
}
Затем я компилирую это в объектный файл с именем apiwrapper.o, используя следующую команду:
g++ -L../include/libs -lapinameapi -shared -fPIC -c -D_LINUX_X86_64 -lpthread -lz -lm -lcrypto -lbz2 -I../include -DPROVIDE_LOG_UTILITIES -DTARGET_PLATFORM_LINUX c_api.cpp -o lapiwrapper.o -lrt
, где apinameapi
- это общая библиотека от поставщика API. Это прекрасно работает. Затем я генерирую файл библиотеки, используя:
ar rc libapiwrapper.a apiwrapper.o
Опять же, это нормально.
Теперь я создаю свой C файл (mycode. c), который содержит:
#include "mycode.h"
#include <stdio.h>
#include <string.h>
#include <time.h>
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
int connectToApi() {
// Init API
rc = apiname_api_init("programname");
}
Заголовочный файл mycode.h содержит:
#include <stdbool.h>
#include <stdint.h>
#include "c_api.h"
(очевидно, есть и другие вещи, но я оставил это для краткости).
Итак , Я компилирую свою основную программу, используя:
gcc -Linclude/libs -lapiwrapper -shared -DKXVER=3 -fPIC -D_LINUX_X86_64 -lpthread -lz -lm -lcrypto -lbz2 -Iinclude -DPROVIDE_LOG_UTILITIES -DTARGET_PLATFORM_LINUX src/mycode.c -o lib/mycode.so -lrt -Wno-discarded-qualifiers -Wno-incompatible-pointer-types
, что тоже нормально. Затем я запускаю программу (этот конкретный файл загружается другим фрагментом кода) и получаю
undefined symbol: apiname_api_init
Кажется, он не находит функцию в файле библиотеки. Где я ошибаюсь? Это мой первый раз, когда я создаю библиотеку, так что это, вероятно, что-то довольно базовое c.
EDIT: я думаю, что проблема может быть связана с тем, что окончательная компиляция (которая создает mycode.so) создает общий объектный файл, и мне нужно, чтобы он запускался сам по себе (без необходимости наличия моего сгенерированного файла библиотеки). Мне нужно запустить последний объект из другой программы, поэтому он должен быть автономным. Есть ли способ связать это, чтобы "связать" все вместе в один окончательный файл so?