Я пытаюсь создать общую библиотеку в Windows. Я могу создать эту общую библиотеку в Linux, но в Windows я получаю ошибки компоновщика. Я использую MinGW G ++ 4.5 компилятор. Сначала я предоставлю исходный код примера в Linux, а затем представлю файл, который я пытался изменить в Windows.
/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. -o$@ 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 g ++ в 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, используя переменную extern, как это работает в linux ?. Я прочитал статью stackoverflow:
Невозможно получить доступ к переменной в C ++ DLL из приложения C , но "я думаю" между этими двумя случаями есть небольшая разница. Там он пытается связать файл, здесь я пытаюсь создать общую библиотеку, используя переменную, для которой не было выделено хранилище (extern), и я хочу сказать компоновщику игнорировать хранилище этой переменной при создании библиотеки. - это будет решено, когда я связываюсь с exe. В настоящее время я решаю эту проблему с помощью статического связывания.
Большое спасибо за вашу помощь заранее.