代码之家  ›  专栏  ›  技术社区  ›  Mohamed Benmahdjoub

cmake-为生成的项目定义dll目录或文件

  •  1
  • Mohamed Benmahdjoub  · 技术社区  · 6 年前

    我有一个我正在使用的项目 CMake 对于 Visual Studio .
    这个 .exe 文件需要2个dll文件(我现在正在复制到调试文件夹中)。

    有没有办法加上 动态链接库 / DLLS目录 通过 CMakeLists.txt / FindLibrary.cmake
    (与查找库的方法相同 *.lib 或者以我忽略的其他方式)这样我 不要复制 他们 手动 里面 这个 调试 文件夹 每次我在另一个文件夹/pc中生成项目时(因为dll的文件夹是已知的)?

    更新:

    CMAKLISTS.TXT

    ..
    ..
    set (ENVLIB $ENV{MYLIB})
    FUNCTION (CONFIGURE_DEBUGGER TARGET_NAME)
      CONFIGURE_FILE(common/build/template/Main.vcxproj.user
        ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.vcxproj.user
        @ONLY
        )
    ENDFUNCTION (CONFIGURE_DEBUGGER)
    ..
    ..
    ADD_EXECUTABLE(Main Main.cxx)
    CONFIGURE_DEBUGGER(Main)
    

    主.vcxproj.user

    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
        <LocalDebuggerCommandArguments>-D20</LocalDebuggerCommandArguments>
        <LocalDebuggerEnvironment>PATH=@ENVLIB@bin;$(Path)
    $(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
        <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
      </PropertyGroup>
    
      <!-- Additional PropertyGroups for the rest of Configuration/Platform combos -->
    
    </Project>
    

    生成后vcxproj.user的输出
    <LocalDebuggerEnvironment>PATH=C:\Program Files\MyLib\bin;$(Path)

    变量 ENVLIB 在复制文件时已更改为正确的路径,但
    Visual Studio仍在请求这些DLL。就像忽略了文件一样 .vcxproj.user

    解决了的:

    已解决更改了属性: <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dan MaÅ¡ek    6 年前

    第一个选项是创建自定义目标,该目标将运行cmake脚本来复制文件。

    第二种选择(我更喜欢)是使用 CONFIGURE_FILE 生成一个 .vcxproj.user 文件,设置 LocalDebuggerEnvironment 这样就可以将包含dll的目录添加到路径中。

    例如,我的构建系统定义了一个函数 CONFIGURE_DEBUGGER :

    FUNCTION(CONFIGURE_DEBUGGER TARGET_NAME)
      CONFIGURE_FILE(${ROOT}/common/build/template/executable_vs14.vcxproj.user
        ${CMAKE_CURRENT_BINARY_DIR}/${TARGET_NAME}.vcxproj.user
        @ONLY
        )
    ENDFUNCTION(CONFIGURE_DEBUGGER)
    

    我在定义可执行目标后立即调用此函数,例如

    ADD_EXECUTABLE(example
      ${EXAMPLE__SRC}
      ${EXAMPLE__HDR}
    )
    CONFIGURE_DEBUGGER(example)
    

    模板 executable_vs14.vcxproj.user 如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
        <LocalDebuggerCommandArguments>-D20</LocalDebuggerCommandArguments>
        <LocalDebuggerWorkingDirectory>$(TargetDir)\..\..\common\</LocalDebuggerWorkingDirectory>
        <LocalDebuggerEnvironment>PATH=$(SolutionDir)..\deps\bin;$(Path)
    $(LocalDebuggerEnvironment)</LocalDebuggerEnvironment>
        <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
      </PropertyGroup>
    
      <!-- Additional PropertyGroups for the rest of Configuration/Platform combos -->
    
    </Project>
    

    注意:在上面的示例中,我还设置了一些默认的命令参数来在调试时运行应用程序,以及它运行的工作目录——根据需要进行调整。

    注2:现在我在看,也许我们可以改变 Condition PropertyGroup 使其适用于每个配置/平台。我得调查一下。