Thanks to kiyolee I have a VS2022 solution to build zlib and libzip (git clone of https://github.com/kiyolee/libzip-win-build and https://github.com/kiyolee/zlib-win-build) and I'd like to extend this in a new DLL project. I could simply add code to the ziplib project, but that has future update implications I'd like to avoid, i.e. I want to keep kiyolee's solutions as they are and be able to update them without needing to repeatedly merge in my changes.
I fail to link to the libzip-static.lib starting with a C++ DLL project and think that's because of the mismatch of C++ and C (zlib and libzip are C projects).
Within the libzip.sln solution there are also derivitive projects like ziptool and zipmerge, which each are EXE projects. I succeeded copying such a project and renaming it (why isn't that a VS feature?) by manually editing the XML of the vcproj file copies and can therefore create a separate new tool as another derivitive work. There's just one problem: The tool projects all are exe projects, chaging the configuration type from exe to dll doesn't build a dll, I'm also not finding a template project of a C Dll, MS seems to think that's obsolete.
So, in short, how would you go about creating a DLL based on the VS2022 libzip.sln solution without modifying this solution itself, but properly link to the libs the solutions build? I'd be fine whether the new DLL project is a C or C++ DLL, MFC or not.
This is not an MCVE ([SO]: How to create a Minimal, Reproducible Example (reprex (mcve))).
The statement "think that's because of the mismatch of C++ and C (zlib and libzip are C projects)" isn't backed up by anything, and if things are done right, there should be no problem.
2 key aspects to be considered. A VStudio project:
Can "belong" to multiple solutions (there can be an M:N relationship between solutions and projects, and not 1:N (like people might be tempted to think))
Must be properly configured. It can be trickier when:
Using external artefacts (libs, headers, ...). I explained this (pretty well, I'd say) for OpenSSL: [SO]: How to include OpenSSL in Visual Studio (@CristiFati's answer), so I won't do it again here
Having multiple platforms / configurations. Might check [SO]: Excel VBA, Can't Find DLL Entry Point from a DLL file (@CristiFati's answer)
Working on the following structure:
code00.sln:
libz-static.vcxproj (from zlib-win-build (build-VS2022))
libzip-static.vcxproj (from libzip-win-build (build-VS2022))
dll00.vcxproj (uses the previous 2)
app00.vcxproj (dummy wrapper app to test the .dll)
Files layout:
[cfati@CFATI-5510-0:e:\Work\Dev\StackExchange\StackOverflow\q079357913]> sopr.bat ### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ### [prompt]> [prompt]> :: --- Current dir --- [prompt]> dir /b code data [prompt]> [prompt]> :: ------ code dir ------ [prompt]> dir /b code app00 bin code00.sln Debug dll00 libzip-win-build x64 zlib-win-build [prompt]> [prompt]> :: --------- dll00 dir --------- [prompt]> dir /b code\dll00 dll00.vcxproj dll00.vcxproj.filters dll00.vcxproj.user include src Win32-Debug x64-Debug [prompt]> [prompt]> dir /b code\dll00\include dll00.hpp [prompt]> [prompt]> dir /b code\dll00\src dll00.cpp [prompt]> [prompt]> :: --------- app00 dir --------- [prompt]> dir /b code\app00 app00.vcxproj app00.vcxproj.filters app00.vcxproj.user src Win32-Debug x64-Debug [prompt]> [prompt]> dir /b code\app00\src main00.cpp
code/code00.sln:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35527.113
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "app00", "app00\app00.vcxproj", "{5C60F6F8-F3B7-4B08-9BB3-5FE6CEAA1F61}"
ProjectSection(ProjectDependencies) = postProject
{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB} = {BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dll00", "dll00\dll00.vcxproj", "{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}"
ProjectSection(ProjectDependencies) = postProject
{B56D17BC-072B-42F3-844A-870A07AFBAAA} = {B56D17BC-072B-42F3-844A-870A07AFBAAA}
{C490F8C7-D8E8-43C9-8D09-9BC8AB705098} = {C490F8C7-D8E8-43C9-8D09-9BC8AB705098}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzip-static", "libzip-win-build\build-VS2022\libzip-static\libzip-static.vcxproj", "{C490F8C7-D8E8-43C9-8D09-9BC8AB705098}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libz-static", "zlib-win-build\build-VS2022\libz-static\libz-static.vcxproj", "{B56D17BC-072B-42F3-844A-870A07AFBAAA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5C60F6F8-F3B7-4B08-9BB3-5FE6CEAA1F61}.Debug|x64.ActiveCfg = Debug|x64
{5C60F6F8-F3B7-4B08-9BB3-5FE6CEAA1F61}.Debug|x64.Build.0 = Debug|x64
{5C60F6F8-F3B7-4B08-9BB3-5FE6CEAA1F61}.Debug|x86.ActiveCfg = Debug|Win32
{5C60F6F8-F3B7-4B08-9BB3-5FE6CEAA1F61}.Debug|x86.Build.0 = Debug|Win32
{5C60F6F8-F3B7-4B08-9BB3-5FE6CEAA1F61}.Release|x64.ActiveCfg = Release|x64
{5C60F6F8-F3B7-4B08-9BB3-5FE6CEAA1F61}.Release|x64.Build.0 = Release|x64
{5C60F6F8-F3B7-4B08-9BB3-5FE6CEAA1F61}.Release|x86.ActiveCfg = Release|Win32
{5C60F6F8-F3B7-4B08-9BB3-5FE6CEAA1F61}.Release|x86.Build.0 = Release|Win32
{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}.Debug|x64.ActiveCfg = Debug|x64
{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}.Debug|x64.Build.0 = Debug|x64
{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}.Debug|x86.ActiveCfg = Debug|Win32
{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}.Debug|x86.Build.0 = Debug|Win32
{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}.Release|x64.ActiveCfg = Release|x64
{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}.Release|x64.Build.0 = Release|x64
{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}.Release|x86.ActiveCfg = Release|Win32
{BD1F46B7-A799-43BC-AD53-58A2BE95ADFB}.Release|x86.Build.0 = Release|Win32
{C490F8C7-D8E8-43C9-8D09-9BC8AB705098}.Debug|x64.ActiveCfg = Debug|x64
{C490F8C7-D8E8-43C9-8D09-9BC8AB705098}.Debug|x64.Build.0 = Debug|x64
{C490F8C7-D8E8-43C9-8D09-9BC8AB705098}.Debug|x86.ActiveCfg = Debug|Win32
{C490F8C7-D8E8-43C9-8D09-9BC8AB705098}.Debug|x86.Build.0 = Debug|Win32
{C490F8C7-D8E8-43C9-8D09-9BC8AB705098}.Release|x64.ActiveCfg = Release|x64
{C490F8C7-D8E8-43C9-8D09-9BC8AB705098}.Release|x64.Build.0 = Release|x64
{C490F8C7-D8E8-43C9-8D09-9BC8AB705098}.Release|x86.ActiveCfg = Release|Win32
{C490F8C7-D8E8-43C9-8D09-9BC8AB705098}.Release|x86.Build.0 = Release|Win32
{B56D17BC-072B-42F3-844A-870A07AFBAAA}.Debug|x64.ActiveCfg = Debug|x64
{B56D17BC-072B-42F3-844A-870A07AFBAAA}.Debug|x64.Build.0 = Debug|x64
{B56D17BC-072B-42F3-844A-870A07AFBAAA}.Debug|x86.ActiveCfg = Debug|Win32
{B56D17BC-072B-42F3-844A-870A07AFBAAA}.Debug|x86.Build.0 = Debug|Win32
{B56D17BC-072B-42F3-844A-870A07AFBAAA}.Release|x64.ActiveCfg = Release|x64
{B56D17BC-072B-42F3-844A-870A07AFBAAA}.Release|x64.Build.0 = Release|x64
{B56D17BC-072B-42F3-844A-870A07AFBAAA}.Release|x86.ActiveCfg = Release|Win32
{B56D17BC-072B-42F3-844A-870A07AFBAAA}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
code/dll00/dll00.vcxproj:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{bd1f46b7-a799-43bc-ad53-58a2be95adfb}</ProjectGuid>
<RootNamespace>dll00</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Platform)-$(Configuration)\</IntDir>
<TargetName>lib$(ProjectName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir>
<IntDir>$(ProjectDir)$(Platform)-$(Configuration)\</IntDir>
<TargetName>lib$(ProjectName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<IntDir>$(ProjectDir)$(Platform)-$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir>
<TargetName>lib$(ProjectName)</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<IntDir>$(ProjectDir)$(Platform)-$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir>
<TargetName>lib$(ProjectName)</TargetName>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)dll00\include;$(SolutionDir)libzip-win-build\lib;$(SolutionDir)libzip-win-build\win32</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)$(Configuration)\</AdditionalLibraryDirectories>
<AdditionalDependencies>$(CoreLibraryDependencies);libzip-static.lib;libz-static.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)dll00\include;$(SolutionDir)libzip-win-build\lib;$(SolutionDir)libzip-win-build\win32</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)$(Configuration)\</AdditionalLibraryDirectories>
<AdditionalDependencies>$(CoreLibraryDependencies);libzip-static.lib;libz-static.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)dll00\include;$(SolutionDir)libzip-win-build\lib;$(SolutionDir)libzip-win-build\win32</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
<AdditionalDependencies>$(CoreLibraryDependencies);libzip-static.lib;libz-static.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)dll00\include;$(SolutionDir)libzip-win-build\lib;$(SolutionDir)libzip-win-build\win32</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)$(Platform)\$(Configuration)\</AdditionalLibraryDirectories>
<AdditionalDependencies>$(CoreLibraryDependencies);libzip-static.lib;libz-static.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="src\dll00.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="include\dll00.hpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
code/dll00/dll00.vcxproj.filters:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\dll00.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="include\dll00.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
code/dll00/include/dll00.hpp:
#pragma once
#include <string>
#if defined(_WIN32)
# define F_OK 0
# include <io.h>
#else
# define _access access
# include <unistd.h>
#endif
#if defined(_WIN32)
# if defined(DLL00_EXPORTS)
# define DLL00_EXPORT_API __declspec(dllexport)
# else
# define DLL00_EXPORT_API __declspec(dllimport)
# endif
#else
# define DLL00_EXPORT_API
#endif
namespace dll00 {
#if defined(__cplusplus)
extern "C" {
#endif
DLL00_EXPORT_API int zipFile(const std::string &archive, const std::string &file);
#if defined(__cplusplus)
}
#endif
}
code/dll00/src/dll00.cpp:
#define DLL00_EXPORTS
#include <dll00.hpp>
#include <cerrno>
#include <cstdio>
#include <zip.h>
#define ZIP_ERROR(ERR, NAME, TXT, RET) { \
zip_error_t error; \
zip_error_init_with_code(&error, ERR); \
fprintf(stderr, TXT "\nFile: [%s]\nError: [%s]\n", NAME, zip_error_strerror(&error)); \
zip_error_fini(&error); \
return RET; \
}
namespace dll00 {
int zipFile(const std::string& archive, const std::string& file)
{
if (_access(file.c_str(), F_OK) < 0) {
return -1;
}
zip_t *pza = nullptr;
int err = 0;
if ((pza = zip_open(archive.c_str(), ZIP_CREATE, &err)) == nullptr) {
ZIP_ERROR(err, archive.c_str(), "Could not open archve", -1);
}
zip_source_t *pzs = nullptr;
zip_error_t zerr;
if ((pzs = zip_source_file_create(file.c_str(), 0, ZIP_LENGTH_TO_END, &zerr)) == nullptr) {
zip_close(pza);
ZIP_ERROR(zerr.zip_err, file.c_str(), "Could not open file", -1);
}
zip_int64_t idx = -1;
if ((idx = zip_file_add(pza, file.c_str(), pzs, ZIP_FL_OVERWRITE | ZIP_FL_ENC_UTF_8)) < 0) {
zip_source_free(pzs);
zip_close(pza);
zip_error_t* pzert = zip_get_error(pza);
if (pzert) {
ZIP_ERROR(pzert->zip_err, file.c_str(), "Could not add file to archive", -1);
} else {
fprintf(stderr, "Could not add file to archive\n");
return -1;
}
}
zip_close(pza);
pza = nullptr;
fprintf(stdout, "Added file [%s] to archive [%s]\n", file.c_str(), archive.c_str());
return 0;
}
}
code/app00/app00.vcxproj (manually stripped out from this project file everything related to Debug|Win32 configuration to stay below the max 30K chars SO answer limit):
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{5c60f6f8-f3b7-4b08-9bb3-5fe6ceaa1f61}</ProjectGuid>
<RootNamespace>app00</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<IntDir>$(ProjectDir)$(Platform)-$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<IntDir>$(ProjectDir)$(Platform)-$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<IntDir>$(ProjectDir)$(Platform)-$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)bin\$(Platform)-$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)dll00\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(CoreLibraryDependencies);libdll00.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)dll00\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(CoreLibraryDependencies);libdll00.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)dll00\include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>$(CoreLibraryDependencies);libdll00.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(OutDir)</AdditionalLibraryDirectories>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="src\main00.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
code/app00/app00.vcxproj.filters:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\main00.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
code/app00/src/main00.cpp:
#include <string>
#include <cstdio>
#include <dll00.hpp>
int main(int argc, char **argv)
{
if (argc < 3) {
printf("Archive name and (existing) file name must be passed\n");
return -1;
}
if (_access(argv[1], F_OK) < 0) {
printf("Archive name not found. Creating new one\n");
}
int err = dll00::zipFile(argv[1], argv[2]);
if (err) {
printf("zipfile returned %d\n", err);
}
printf("\nDone.\n\n");
return 0;
}
Note: Instead of relying on the 2 3rd-party solutions / projects (which are not best structured from my PoV), you could use already built artefacts from [GitHub]: CristiFati/Prebuilt-Binaries - Prebuilt binaries