簡體   English   中英

C庫的C ++包裝器作為共享庫

[英]C++ Wrapper for C library as shared library

我自己解決了這個問題

問題是圖書館的聯系。 我將libmywrapper.so(我將其重命名)文件復制到/ usr / lib並與-mywrapper鏈接就是這樣:-)

原始帖子:

我正在編寫一個包裝庫,該包裝庫允許從C代碼中調用C ++函數。 不幸的是,它沒有鏈接...

wrapper.h:

#ifdef __cplusplus
extern "C"
{
#endif
    extern char* (keygen) ();
#ifdef __cplusplus
 }
#endif

wrapper.cpp:

#include "wrapper.h"
#include <someincludes>
char* keygen ()
{
    urandom u;

Makefile文件:

TARGET      := ./mywrapperlib.so
CXXFLAGS    := -fPIC -shared -g -Wall -std=c++0x -I../someincludes -I.
CXX         := g++
LIB         := -lsomelibs
EXT         := cpp
BUILDDIR    := build

override BUILDDIR := $(strip $(BUILDDIR))
SOURCES  := $(wildcard *.$(EXT))
OBJECTS  := $(patsubst %.$(EXT), $(BUILDDIR)/%.o, $(SOURCES))
DEPS     := $(patsubst %.$(EXT), $(BUILDDIR)/%.dep, $(SOURCES))

.PHONY: all
all: $(TARGET)

$(TARGET): $(OBJECTS) $(DEPS)
    $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)

ifneq ($(MAKECMDGOALS), clean)
-include $(DEPS)
endif

$(OBJECTS): $(BUILDDIR)/%.o: %.$(EXT) $(BUILDDIR)/%.dep $(BUILDDIR)/.tag
    $(CXX) $(CXXFLAGS) -c $< -o $@

$(DEPS): $(BUILDDIR)/%.dep: %.$(EXT) $(BUILDDIR)/.tag
    mkdir -p $(dir $(@))
    $(CXX) $(CXXFLAGS) -MM $< -MT $@ -MT $(<:.$(EXT)=.o) -o $@

%.tag:
    mkdir -p $(dir $(@))
    touch $@

.PHONY: clean
clean:
    $(RM) -r $(BUILDDIR)

應使用以下庫的測試文件:test.c:

#include <wrapper.h>
int main()
{
    char* test = keygen();
}

當我嘗試用

gcc  -o test.a -g -Iinclude -Llib/mywrapperlib.so test.c

我懂了

/tmp/ccB9bEot.o: In function `main':
/some/paths/test.c:7: undefined reference to `keygen'

我對混合C&C ++代碼和編寫庫沒有經驗。 現在即時通訊卡住了,希望有人可以幫助我解決這個問題。

編輯:

我用nm檢查了lib:

nm lib/cryptdbwrapperlib.so | grep keygen
0000000000006935 T keygen

所以,我想問題是聯系...

這與您標記gcc的順序有關。

做這個:

gcc  -o test.a -g -Iinclude test.c -Llib/mywrapperlib.so
#                           ^^^^^^ ^^^^^^^^^^^^^^^^^^^^^
#                           first    second

GCC從左到右讀取庫和對象,並且(基本上)忽略“還”不需要的任何庫和對象。 在我建議的更改中, test.c首先執行,所以GCC知道它將要尋找符號keygen 然后,當它最終看到-Llib/mywrapperlib.so時,將對其進行掃描以查找keygen ,找到它,並知道此庫是必需的。

wrapper.cpp的函數簽名更改為

extern "C" char* keygen ()

否則,它將使用C ++樣式名稱進行編譯,因此它是與標頭中聲明的函數不同的函數。

我自己解決了這個問題

問題是圖書館的聯系。 我將libmywrapper.so(我將其重命名)文件復制到/ usr / lib並與-mywrapper鏈接就是這樣:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM