Я пытаюсь создать общую библиотеку в Windows. Я могу создать эту общую библиотеку в linux, но в окнах я получаю ошибки компоновщика. Я использую компилятор MinGW G ++ 4.5. Сначала я представлю исходный код примера на linux, а затем представим файл, который я попытался изменить в окнах.с использованием внешней переменной в C++ в общей библиотеке - создание общей библиотеки (dll) с использованием MinGW g ++
/home/nxd/Progs/C++/shared-lib>cat lib_interface.h
#ifndef LIBINTERFACE_H
#define LIBINTERFACE_H
int func(int a);
#endif /* LIBINTERFACE_H */
/home/nxd/Progs/C++/shared-lib>cat sh_lib.cpp
extern int b;
int func(int a)
{
return a+b;
}
/home/nxd/Progs/C++/shared-lib>cat main.cpp
#include <iostream>
#include "lib_interface.h"
int b;
int main()
{
b=10;
std::cout << func(20) << std::endl;
}
/home/nxd/Progs/C++/shared-lib>cat Makefile
OBJS = main.o sh_lib.o
test: main.o libshared.so
g++ -L. [email protected] main.o -lshared
main.o: main.cpp lib_interface.h
g++ -c -Wall -fPIC $<
sh_lib.o: sh_lib.cpp lib_interface.h
g++ -c -Wall -fPIC $<
libshared.so: sh_lib.o
ld -shared -soname=libshared.so -o libshared.so.1 $<
ln -s libshared.so.1 libshared.so
.PHONY: clean
clean:
rm *.o *.so *.so.1
/home/nxd/Progs/C++/shared-lib>make
g++ -c -Wall -fPIC main.cpp
g++ -c -Wall -fPIC sh_lib.cpp
ld -shared -soname=libshared.so -o libshared.so.1 sh_lib.o
ln -s libshared.so.1 libshared.so
g++ -L. -otest main.o -lshared
/home/nxd/Progs/C++/shared-lib>LD_LIBRARY_PATH=. ./test
30
Я попытался сделать общую библиотеку из sh_lib.cpp с использованием MinGW г ++ на Windows. Причина, по которой так много комментариев, объясняется многими вещами, которые я пробовал, прежде чем решил опубликовать это.
/home/nxd>cat sh_lib.cpp
//extern "C" __declspec(dllimport) int b;
//#ifdef __cplusplus
//extern "C" {
//#endif
__declspec(dllimport) extern int b;
//__declspec(dllimport) int b;
//extern int b;
//#ifdef __cplusplus
//}
//#endif
int func(int a)
{
return a+b;
}
Ниже приведена соответствующая часть файла Makefile с различными твиками. Параметры, переданные компоновщику, который вы видите ниже, были добавлены один за другим, чтобы попытаться избавиться от ошибки связи. Приведенная ниже команда ld заключалась в том, чтобы убедиться, что компоновщик действительно получает варианты. Предыдущий дефис говорит make выполнить следующую команду, даже если текущий имеет ошибки.
sh_lib.o: sh_lib.cpp lib_interface.h
g++ -c -Wall -fPIC $<
libshared.so: sh_lib.o
-ld -shared --enable-auto-import --unresolved-symbols=ignore-in-shared-libs -soname=libshared.so --allow-shlib-undefined -o libshared.so.1 $<
g++ -shared -Wl,--unresolved-symbols=ignore-in-shared-libs -Wl,--enable-auto-import -Wl,--allow-shlib-undefined -Wl,-soname,libshared.so -o libshared.so.1 $<
Мой вопрос: как я могу скомпилировать sh_lib.cpp в DLL, используя внешнюю переменную, как, как она работает в Linux ?. Я прочитал статью stackoverflow: Can't access variable in C++ DLL from a C app, но «я думаю» между двумя случаями есть тонкая разница. Там он пытался связать файл, здесь я пытаюсь создать общую библиотеку, используя переменную, для которой хранилище не было выделено (extern), и я хочу сказать компоновщику игнорировать хранилище этой переменной при создании библиотеки - он будет разрешен, когда я свяжусь с exe. В настоящее время я управляю этой проблемой со статической привязкой.
Большое спасибо за вашу помощь заранее.
Я начал «sh_lib.cpp» с extern int b; Но когда я пытаюсь создать общую библиотеку, я получаю сообщение об ошибке «undefined reference to b». Я не получаю эту ошибку в Linux. > Остается вопрос, имеет ли смысл внешний мир,> могут быть лучшие варианты. Ну, исходный пример - это компилятор, который я разрабатываю - исходный код http://sourceforge.net/projects/xtcc в qscript-0.7.tar.gz. Глобальная переменная - это «список вопросов», необходимый в средах среды выполнения и компиляции , – Neil
Я действительно не думал об этом, отредактировал ответ: я не уверен, что это может когда-либо работать с dll .. надеюсь, кто-то еще может дать более глубокое понимание? – stijn