Depois de ler várias postagens no fórum sobre o meu problema que não me ajudaram em nada, peço ajuda. Estou tentando criar um .dll com o compilador GNU no Windows. Este .dll precisa de uma biblioteca, por enquanto chamamos de mylib, para funcionar. Então eu crio uma biblioteca estática mylib.a com:
ar rcs mylib.a file1.o file2.o file3.o file4.o
Criei os arquivos .o individualmente com
g++ -c file1.cpp.
Agora, para criar o .dll e vincular mylib.a, digito o seguinte comando:
g++ -shared -o mydll.dll Dynamicfunc.cpp -l:mylib.a
onde Dynamicfunc.cpp contém a implementação do .dll. Ao executar este comando, aparece a seguinte mensagem de erro:
C:/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -l:mylib.a: No such file or directory
collect2.exe: error: ld returned 1 exit status
Na maioria dos posts sobre este tema, a solução para o problema foi adicionar o prefixo “lib”. Então, no meu caso -l:libmylib.a que infelizmente também não funcionou. Além disso, o arquivo mylib.a está no mesmo diretório que Dynamicfunc.cpp, o que torna o uso de -L desnecessário, mas mesmo com -L:C:......\src, ld.exe não encontra o mylib.a especificado arquivo. Se eu transformar todos os arquivos objeto (arquivo1.o arquivo2.o...) em um .lib em vez de uma biblioteca .a, ele também não funcionará. Além disso, tentei criar mylib.a sem
ar rcs libout.a ...
mas com
g++ -static -o mylib.a file1.o file2.o ...
também sem sucesso. Eu realmente apreciaria qualquer sugestão. g++ -v:
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=C:/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/13.2.0/lto-wrapper.exe
OFFLOAD_TARGET_NAMES=nvptx-none
Target: x86_64-w64-mingw32
Configured with: ../configure --prefix=/R/winlibs64ucrt_stage/inst_gcc-13.2.0/share/gcc --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --enable-offload-targets=nvptx-none --with-pkgversion='MinGW-W64 x86_64-ucrt-posix-seh, built by Brecht Sanders'
--with-tune=generic --enable-checking=release --enable-threads=posix --disable-sjlj-exceptions --disable-libunwind-exceptions --disable-serial-configure --disable-bootstrap --enable-host-shared --enable-plugin --disable-default-ssp --disable-rpath --disable-libstdcxx-debug --disable-version-specific-runtime-libs
--with-stabs --disable-symvers --enable-languages=c,c++,fortran,lto,objc,obj-c++ --disable-gold --disable-nls --disable-stage1-checking --disable-win32-registry --disable-multilib --enable-ld --enable-libquadmath --enable-libada --enable-libssp --enable-libstdcxx --enable-lto --enable-fully-dynamic-string --enable-libgomp
--enable-graphite --enable-mingw-wildcard --enable-libstdcxx-time --enable-libstdcxx-pch --with-mpc=/d/Prog/winlibs64ucrt_stage/custombuilt --with-mpfr=/d/Prog/winlibs64ucrt_stage/custombuilt --with-gmp=/d/Prog/winlibs64ucrt_stage/custombuilt --with-isl=/d/Prog/winlibs64ucrt_stage/custombuilt
--disable-libstdcxx-backtrace --enable-install-libiberty --enable-__cxa_atexit --without-included-gettext --with-diagnostics-color=auto --enable-clocale=generic --with-libiconv --with-system-zlib
--with-build-sysroot=/R/winlibs64ucrt_stage/gcc-13.2.0/build_mingw/mingw-w64 CFLAGS='-I/d/Prog/winlibs64ucrt_stage/custombuilt/include/libdl-win32 -Wno-int-conversion -march=nocona -msahf -mtune=generic -O2' CXXFLAGS='-Wno-int-conversion -march=nocona -msahf -mtune=generic -O2' LDFLAGS='-pthread -Wl,--no-insert-timestamp -Wl,--dynamicbase -Wl,--high-entropy-va -Wl,--nxcompat -Wl,--tsaware'
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.2.0 (MinGW-W64 x86_64-ucrt-posix-seh, built by Brecht Sanders)
-l:mylib.a
pesquisa no caminho de pesquisa da biblioteca um arquivo chamadomylib.a
. O diretório de trabalho atual não está no caminho de pesquisa da biblioteca por padrão. Você pode adicioná-lo lá:ou apenas use o nome do arquivo diretamente, sem
-l
sinalizador:Se você estiver criando uma DLL, poderá precisar de mais alguns sinalizadores:
g++ -static -o mylib.a ...
não vai funcionar. Usear
para criar uma biblioteca estática.