CMake - 为生成的项目定义 dll 目录或文件
CMake - Define dlls directory or files for a generated project
我正在使用 CMake
为 Visual Studio
构建一个项目。
.exe
文件需要 2 个 dll 文件(我现在正在将其复制到 Debug forlder)。
有没有办法通过CMakeLists.txt
[=61添加dlls/dlls目录 =] / FindLibrary.cmake
(与 find_library 查找 *.lib
或其他一些我忽略的方式相同) 所以我 不复制 它们 MANUALLY inside Debug 文件夹 每次我在另一个folder/pc 中生成项目(因为dll 的文件夹是已知的)?
更新:
CMakeLists.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)
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'">
第一个选项是创建一个自定义目标,它将运行一个用于复制文件的 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>
注意:在上面的示例中,我还设置了一些默认命令参数 运行 调试时使用的应用程序以及 运行s 所在的工作目录——根据您的需要进行调整需要。
注意 2:既然我正在查看它,也许我们可以更改 PropertyGroup
上的 Condition
以使其适用于每个 configuration/platform。必须调查一下。
我正在使用 CMake
为 Visual Studio
构建一个项目。
.exe
文件需要 2 个 dll 文件(我现在正在将其复制到 Debug forlder)。
有没有办法通过CMakeLists.txt
[=61添加dlls/dlls目录 =] / FindLibrary.cmake
(与 find_library 查找 *.lib
或其他一些我忽略的方式相同) 所以我 不复制 它们 MANUALLY inside Debug 文件夹 每次我在另一个folder/pc 中生成项目(因为dll 的文件夹是已知的)?
更新:
CMakeLists.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)
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'">
第一个选项是创建一个自定义目标,它将运行一个用于复制文件的 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>
注意:在上面的示例中,我还设置了一些默认命令参数 运行 调试时使用的应用程序以及 运行s 所在的工作目录——根据您的需要进行调整需要。
注意 2:既然我正在查看它,也许我们可以更改 PropertyGroup
上的 Condition
以使其适用于每个 configuration/platform。必须调查一下。