2012-12-14 70 views
2

我解決了這個問題所作MYSELFC++包裝器C庫作爲共享庫

問題是庫的連接。 我複製了libmywrapper.so(我給它改名)文件到/ usr/lib和與-mywrapper 就是這樣:-)

原帖鏈接:

我正在寫一個包裝庫允許從C代碼中調用C++函數。 Unfortnuately它不會鏈接...

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 [email protected] 

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

%.tag: 
    mkdir -p $(dir $(@)) 
    touch [email protected] 

.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++代碼,寫庫。 現在我卡住了,希望有人能幫助我解決這個問題。

編輯:

我檢查與納米的lib:

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

所以,我想這個問題是聯動...

+2

問題標題在編寫時有意義嗎? ;) – jalf

+0

它*庫* –

+0

喲,dawg ....... –

回答

1

這是你的標誌的順序做到gcc

這樣做:

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

GCC讀庫和對象左到右(基本)忽略不需要的「但」任何。隨着我提出的更改,test.c首先讓GCC知道它將尋找一個符號keygen;然後,當它終於看到-Llib/mywrapperlib.so它掃描它的keygen,找到它,並知道這個庫是必需的。

+0

不幸的是,這並沒有解決它。 – user1904027

+1

請注意真正的問題,該行沒有鏈接到共享對象,它只是指定一個(無效)路徑來搜索庫(-L,還需要-l參數,共享庫可能應該被命名爲libmywrapper.so所以你可以做-Llib -lmywrapper) – nos

0

更改該函數在wrapper.cpp

extern "C" char* keygen() 

簽名,否則它會用C++風格的名字被編譯,因此會比一個在頭部聲明不同的功能。

+1

不,只需要在初始聲明中指定鏈接。 –

0

我解決了這個問題所作MYSELF

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