如何使用CMake来使用两个不同版本的Python?

问题描述 投票:0回答:1

上下文。

我正在构建一个CMake项目。这个CMake项目在docker容器内运行,使用CLion远程开发,以便直接在docker内开发我的代码。因此所有的头文件和lib都在docker里面。

现在,因为我的项目被分割成几个部分,我有一个 "main "CMakelists.txt,它正在调用下面的部分,就像这样。

--- CMakelists.txt

注:单独构建每一个都可以。

问题是,Project_part3 需要 Python2作为解释器。但上面的那个(part1, part2) 需要 Python3.

当只包含Project_part1 &Project_part2时,它可以在CLion上正常构建,当只包含Project_part3时,它可以在CLion上正常构建。

为了定义在编译过程中使用哪个Python版本,需要使用和设置一些环境。

ROS_PYTHON_VERSION
PYTHON_EXECUTABLE

Part_1 和 Part_2 需要 ROS_PYTHON_VERSION = 3 和 PYTHON_EXECUTABLE = usrbinpython3Part_2 需要 ROS_PYTHON_VERSION = 2 和 PYTHON_EXECUTABLE = usrbinpython2。

但是,发生了什么事,第一个得到includebuild的似乎是 逼迫 后的那个版本,以使用它所使用的Python。

我尝试的是 (伪 cmake 代码)。

set_env_var_for_part1_part2。

include_part1_part2> 正确地构建在CLion上。

set_env_var_for_3

set_env_var_for_part1_part2。

include_part1_part2> 正确地构建在CLion上。

set_env_var_for_part1_part2。

set_env_var_for_3。

include_part1_part2-> 在CLion上正确构建。

-> 没有错误

set_env_var_for_3。

include_part3-> 正确地构建在CLion上。

set_env_var_for_3

set_env_var_for_part1_part2。

include_part3-> 正确地构建在CLion上。

set_env_var_for_part1_part2。

set_env_var_for_3。

include_part3-> 在CLion上正确构建。

-> 没有错误

set_env_var_for_3。

include_part3

set_env_var_for_part1_part2。

include_part1_part2> ERROR 在part1_part2上构建CLion。

set_env_var_for_part1_part2.

include_part1_part2

set_env_var_for_3。

include_part3-> ERROR Building on CLion on part3.

... 无论我做什么都是错误。

从错误来看。把我的话当做是理所当然的,这是因为他们分别没有找到他们需要构建的一些包,而且是 因为 他们使用了错误的python版本。Part1 和 Part2 需要 Python3,Part3 需要 Python2。

CLion IDE 中没有设置环境变量。

结论,设置环境变量似乎并没有什么变化。于是我在CMakeCache.txt中发现PYTHON_EXECUTABLE:FILEPATH=usrbinpython,这就可以解释了,既然在这里设置了,而且已经找到了一次,可能就不需要再更新了。清理缓存,删除cmake-build-debug也没有任何改变。

我被卡住了。我需要一个方法让所有这些程序都能用不同版本的python来构建。

python cmake clion
1个回答
0
投票

好吧,所以,CMakeCache.txt确实是强制将python的路径设置为第一个使用的路径。我试图改变环境变量,但我猜测在一个env变量被看到之后,它就会进入CMakeCache.txt中被使用,而不是真正的得到环境变量。

所以,与其像我这样修改Python。set( ENV{PYTHON_EXECUTABLE} /usr/bin/python3) 好的方法是直接改变CMake中的变量。

set( PYTHON_EXECUTABLE /usr/bin/python3 )
© www.soinside.com 2019 - 2024. All rights reserved.