Olej писал(а): ↑25 июн 2021, 15:43
А теперь собираем всё это до кучи:
А вот теперь самое интересное...
Вы можете собрать sqrimpl.cc - в отдельную разделяемую (DLL) библиотеку ... (или статическую) ... абсолютно из тех же
всех исходных кодов (без изменений), только используя новый Makefile:
Код: Выделить всё
olej@R420:~/2021/OWN_TEST.codes/p2sqr$ cat Makefile.dll
PROG = p2sqr
LNAME = sqr
LIB = lib$(LNAME).so
CXX += -Wall -std=c++11 -pedantic
all: $(LIB) $(PROG)
%.o: %.cc
$(CXX) -c $< -o $@
$(LIB): sqrimpl.cc sqrimpl.h
$(CXX) -c -fpic -fPIC -shared $< -o sqrimpl.o
$(CXX) -shared -o $(LIB) sqrimpl.o
rm -f sqrimpl.o
$(PROG): $(PROG).cc sqr.o $(LIB)
$(CXX) $< sqr.o -Bdynamic -L./ -l$(LNAME) -o $@
clean:
rm -f $(PROG) $(LIB) *.o
Сборка:
Код: Выделить всё
olej@R420:~/2021/OWN_TEST.codes/p2sqr$ make -f Makefile.dll clean
rm -f p2sqr libsqr.so *.o
olej@R420:~/2021/OWN_TEST.codes/p2sqr$ make -f Makefile.dll
g++ -Wall -std=c++11 -pedantic -c -fpic -fPIC -shared sqrimpl.cc -o sqrimpl.o
g++ -Wall -std=c++11 -pedantic -shared -o libsqr.so sqrimpl.o
rm -f sqrimpl.o
g++ -Wall -std=c++11 -pedantic -c sqr.cc -o sqr.o
g++ -Wall -std=c++11 -pedantic p2sqr.cc sqr.o -Bdynamic -L./ -lsqr -o p2sqr
И вообще не поставлять в комплекте приложения sqrimpl.cc (код реализации), а предоставлять готовую
бинарную библиотеку.
Код: Выделить всё
olej@R420:~/2021/OWN_TEST.codes/p2sqr$ ls -l lib*
-rwxrwxr-x 1 olej olej 23832 июн 25 16:10 libsqr.so
olej@R420:~/2021/OWN_TEST.codes/p2sqr$ ldd p2sqr
linux-vdso.so.1 (0x00007ffd6bffe000)
libsqr.so => /home/olej/2021/OWN_TEST.codes/p2sqr/libsqr.so (0x00007f6396451000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6396256000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6396107000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f63960ec000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6395efa000)
/lib64/ld-linux-x86-64.so.2 (0x00007f639645f000)
И всё выполняется так же:
Код: Выделить всё
olej@R420:~/2021/OWN_TEST.codes/p2sqr$ export LD_LIBRARY_PATH=`pwd`; ./p2sqr
число [>0] (Enter - завершение): 3
задан аргумент: 3
эталонный результат = 1.73205
метод [0..4] (Enter - завершение методов): 3
метод: exp (...ln)
SQRT(3) = 1.73205 [-1.79482e-06%]
время 1000000 вычислений [мксек] = 55536.555
метод [0..4] (Enter - завершение методов):
число [>0] (Enter - завершение):
Ура!
Сбылась сокровенная мечта выньдаунов: теперь исходный код реализации можно не предоставлять!