我在Internet上做了很多研究,但无法解决自己的问题。
对于Windows构建环境,我们需要Oracle客户端。没有环境变量包含ORACLE_HOME的路径。但是在注册表中有此路径,如here所述。
据我发现,CMake也可以读取注册表。这已经在Stackoverflow上被问过了。但是在我的环境中,这是行不通的,而且我的想法也用光了。
首先,我尝试了 set 命令。但这不再起作用。
set(ora_set "[HKLM\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1\\ORACLE_HOME]")
message( "ora_set (set) = ${ora_set}" )
输出:
ora_set (set) = [HKLM\SOFTWARE\ORACLE\KEY_OraClient12Home1\ORACLE_HOME]
我本来希望得到<Path to ORACLE_HOME>
,但是我已经有了<[HKLM\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1\\ORACLE_HOME]>
。
然后我尝试了 get_filename_component ,如StackOverflow上的here所述:
get_filename_component(ora_gfc "[HKLM\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1\\ORACLE_HOME]" ABSOLUTE CACHE)
message( "ora_gfc (get_filename_component) = ${ora_gfc}" )
输出:
ora_gfc (get_filename_component) = <Path to ORACLE_HOME>[HKLM/SOFTWARE/ORACLE/KEY_OraClient12Home1/ORACLE_HOME]
我期望得到<Path to ORACLE_HOME>
,但我已经得到<Path to ORACLE_HOME[HKLM\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1\\ORACLE_HOME]>
。 CMake总是将注册表路径附加到注册表中的值。我找不到防止这种情况的方法。
我尝试了 execute_process 作为第三种可能性,因为使用reg查询,您还可以按照here的说明从批处理中读取注册表。
execute_process (
COMMAND FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1" /v ORACLE_HOME`) DO ECHO %%A
OUTPUT_VARIABLE ora_exp
)
message( "ora_exp (execute_process) = ${ora_exp}" )
输出:
ora_exp (execute_process) =
我期望得到<Path to ORACLE_HOME>
,但是我有一个空变量。尽管批处理命令在单独的批处理文件中按预期工作,但CMake似乎也不喜欢。
现在我迷路了:如何使用CMake正确读取注册表值。有人提示吗?
我的环境是
答案 0 :(得分:0)
似乎发生了两件事。您不能使用set来读取注册表。 https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-get-a-windows-registry-key-
GET_FILENAME_COMPONENT(test_set "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\debug\\x64;Version]" ABSOLUTE CACHE)
message( "test_set (set) = ${test_set}" )
张照片:
test_set (set) = C:/Users/XXX/v14.14.26405.00
还请注意密钥的格式。可能应该是:
[HKEY_LOCAL_MACHINE\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1;ORACLE_HOME]
它也仅适用于某些类型的注册表项类型,否则将仅返回/registry
。