0

Ok my problem is simple, but i can't figured it out.

In a single solution I have a project (Application exe) that references another one (lib). This lib references a nuget package, for instance, CxImage.

.targets

<?xml version="1.0" encoding="utf-8"?>
<Project ToolVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemDefinitionGroup>
    <ClCompile>
      <AdditionalIncludeDirectories>"$(MSBuildThisFileDirectory)include";%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <!-- patch -->
      <AdditionalIncludeDirectories>"$(MSBuildThisFileDirectory)include\cximage";%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
    </ClCompile>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="$(Configuration.ToLower().StartsWith('release')) And '$(Platform.ToLower())'=='x64'">
    <Lib>
      <AdditionalLibraryDirectories>"$(MSBuildThisFileDirectory)lib\x64";%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Lib>
    <Link>
      <AdditionalDependencies>CxImage.lib;jpeg.lib;png.lib;tiff.lib;zlib.lib;%(AdditionalDependencies)</AdditionalDependencies>
      <AdditionalLibraryDirectories>"$(MSBuildThisFileDirectory)lib\x64";%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="$(Configuration.ToLower().StartsWith('debug')) And '$(Platform.ToLower())'=='x64'">
    <Lib>
      <AdditionalLibraryDirectories>"$(MSBuildThisFileDirectory)lib\x64";%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Lib>
    <Link>
      <AdditionalDependencies>CxImage_d.lib;jpeg_d.lib;png_d.lib;tiff_d.lib;zlib_d.lib;%(AdditionalDependencies)</AdditionalDependencies>
      <AdditionalLibraryDirectories>"$(MSBuildThisFileDirectory)lib\x64";%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="$(Configuration.ToLower().StartsWith('release')) And '$(Platform.ToLower())'=='win32'">
    <Lib>
      <AdditionalLibraryDirectories>"$(MSBuildThisFileDirectory)lib\x86";%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Lib>
    <Link>
      <AdditionalDependencies>CxImage.lib;jpeg.lib;png.lib;tiff.lib;zlib.lib;%(AdditionalDependencies)</AdditionalDependencies>
      <AdditionalLibraryDirectories>"$(MSBuildThisFileDirectory)lib\x86";%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="$(Configuration.ToLower().StartsWith('debug')) And '$(Platform.ToLower())'=='win32'">
    <Lib>
      <AdditionalLibraryDirectories>"$(MSBuildThisFileDirectory)lib\x86";%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Lib>
    <Link>
      <AdditionalDependencies>CxImage_d.lib;jpeg_d.lib;png_d.lib;tiff_d.lib;zlib_d.lib;%(AdditionalDependencies)</AdditionalDependencies>
      <AdditionalLibraryDirectories>"$(MSBuildThisFileDirectory)lib\x86";%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup />
</Project>

When building the other project that references this lib, it results in a LNK2019 unresolved external symbol "public: __thiscall CxImage::CxImage(unsigned int)" (??0CxImage@@QAE@I@Z) referenced in function

Means that it cannot find lib file of cxImage.

I found a way to fix the problem but I don't think it's right. In the properties of the lib used in other apps, in Librarian > General > Additionnal Dependencies, I added cxImage lib. I though that the first idea behind nuget package was to avoid this kind of thing so...

** it's not related to cxImage, the problem occurs in any other case. I just mentioned this one for instance

Any idea ?? ^^

valiano
  • 16,433
  • 7
  • 64
  • 79

1 Answers1

0

Nuget - LNK2019 when using one of my project that links to a nuget package

You should also add the nuget package CxImage to the reference project.

The project references the lib and the lib references the nuget package CxImage, so the project not reference the nuget package CxImage directly, Visual Studio/MSBuild tries to be smart and only bring references lib over into project rather than add nuget package CxImage to project. Because Visual Studio/MSBuild does not know the indirectly reference CxImage whether is required by the project or not. So Visual Studio/MSBuild does not add the nuget package to the reference project to avoid reference pollution the project. You can refer to the similar issue for detailed info.

In this case, you will get that error "cannot find lib file of cxImage". To resolve this issue, you should also add the nuget package CxImage to the reference project, so that the projest reference the nuget package CxImage directly.

Leo Liu
  • 71,098
  • 10
  • 114
  • 135