相关疑难解决方法(0)

如何在Windows上为CMake自定义命令设置运行时PATH

我正在尝试将基于CMake的*nix项目移植到Windows.主库需要一个头文件由自定义程序生成,因此该CMakeLists.txt文件包含以下内容:

add_executable(TableGenerator "TableGenerator.cpp")
target_link_libraries(TableGenerator ${LibFoo_LIBRARY})

add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/Table.h"
                   COMMAND TableGenerator "${CMAKE_CURRENT_BINARY_DIR}/Table.h"
                   DEPENDS TableGenerator)
Run Code Online (Sandbox Code Playgroud)

一个重要的细节是TableGenerator使用外部共享库LibFoo.例如在Linux下,一切正常,因为libfoo.so它安装在一个系统库目录中/usr/local/lib,或者CMake甚至在可执行文件中设置rpath属性,说明确切地找到库的位置.

但是,在Windows上,这些类通常不会安装到系统中,而是提取或编译到构建树中或附近的某个任意目录中.为了TableGenerator运行,foo.dll需要将其提供或复制到其中一个动态链接库搜索顺序路径(例如,%WINDIR%\System32或构建输出目录TableGenerator),这是不可取的.

如何PATH为自定义命令设置环境变量,即在CMake运行期间但在实际自定义构建步骤运行时期间不使用?

windows dll path cmake visual-studio

14
推荐指数
2
解决办法
8110
查看次数

CTest、CMake 和 MinGW:可执行文件构建,但无法运行,因为找不到新的 DLL

顶层CMakeLists.txt包含:

include(CTest)
add_subdirectory(lib)
add_subdirectory(demo)
add_subdirectory(test)
Run Code Online (Sandbox Code Playgroud)

lib/CMakeLists.txt本质上是:

add_library(MyLib <sources>)
Run Code Online (Sandbox Code Playgroud)

demo/CMakeLists.txt本质上是:

add_executable(Demo demo.c)
target_link_libraries(Demo MyLib)
Run Code Online (Sandbox Code Playgroud)

test/CMakeLists.txt只是:

add_test(NAME Demo COMMAND Demo)
Run Code Online (Sandbox Code Playgroud)

从 gitlab-runner 中,我们执行:

cmake -G "Ninja" -DCMAKE_INSTALL_PREFIX=C:\opt\x64 -B. ..
cmake --build
ctest --output-on-failure
Run Code Online (Sandbox Code Playgroud)

前两步成功;第三个失败并显示:

Start 1: Demo
1/1 Test #1: Demo .......................Exit code 0xc0000135
***Exception:   0.03 sec
Run Code Online (Sandbox Code Playgroud)

如果我重试:

cmake --install
ctest
Run Code Online (Sandbox Code Playgroud)

然后测试成功。所以唯一的问题是build/lib/mylib.dll运行时没有发现ctest。而C:\opt\x64\libPATH,因此 DLL 是在 后找到的cmake --install。然而,这不是我们想要的:ctest应始终使用当前版本中的新 DLL,而不是已安装的版本。

在Linux下,一切正常。为什么 Windows 和 MinGW 不支持呢?这是 CMake 中的错误吗?我们如何解决这个问题,以便ctest …

dll mingw cmake environment-variables ctest

7
推荐指数
2
解决办法
1695
查看次数