【发布时间】:2020-09-16 21:36:21
【问题描述】:
我正在尝试创建一个静态库以允许我在我的 C 程序中使用 C++ API。首先,我尝试调用一个名为APIName::Api_init() 的API 函数;到目前为止,我已经创建了一个“包装器”库,其中包含以下内容:
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
似乎没有在库文件中找到该函数。我哪里错了?这是我第一次构建库,所以它可能是相当基本的东西。
编辑:我认为问题可能来自最终编译(创建 mycode.so)正在生成一个共享对象文件,我需要它自己运行(不需要我生成的库文件也在场)。我必须从另一个程序运行最终对象,所以它需要是独立的。有没有一种方法可以将它链接到一起“捆绑”到一个最终的 so 文件中?
【问题讨论】:
-
我尝试更改顺序,但似乎没有任何区别。还是谢谢。
-
@Sharon 这是一个有趣的问题。但是您能否明确说明“然后,我运行程序”这一特定行。您发布的任何代码中都没有 main() 函数。最终输出的也是
.so文件,你在哪里使用呢? -
@MohithReddy 它是从另一种语言的另一个文件中调用的。所以,我想生成 mycode.so 作为共享对象,然后从其他代码(使用不同的专业语言)可以导入 C 对象并运行它。那有意义吗?所以它会调用类似 mycode.connectToApi() 的东西。
标签: c++ c gcc ld dynamic-linking