我有一个cmake交叉编译工具链文件,简称为:
set(CMAKE_SYSTEM_NAME Linux)
if( DEFINED TC_PATH )
message( STATUS " TC_PATH IS defined. ${TC_PATH}" )
else()
message( FATAL_ERROR " TC_PATH not defined." )
endif()
set(CMAKE_C_COMPILER ${TC_PATH}/usr/bin/i586-linux/i586-linux-gcc )
set(CMAKE_CXX_COMPILER ${TC_PATH}/usr/bin/i586-linux/i586-linux-g++ )
set(CMAKE_LINKER ${TC_PATH}/usr/bin/i586-linux/i586-linux-ld )
我调用cmake,设置TC_PATH以及工具链文件:
~/CMakeTest/output $ cmake -DTC_PATH:PATH=/opt/toolchain -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ../
看来cmake多次调用工具链文件。在前两次,TC_PATH检查成功,但稍后,在识别编译器后,它会抛出错误:
-- TC_PATH IS defined. /opt/toolchain
-- TC_PATH IS defined. /opt/toolchain
-- The C compiler identification is GNU 4.9.1
-- The CXX compiler identification is GNU 4.9.1
-- Check for working C compiler: /opt/toolchain/usr/bin/i586-linux/i586-linux-gcc
CMake Error at /home/gnac/CMakeTest/toolchain.cmake:4 (message):
TC_PATH not defined.
Call Stack (most recent call first):
/home/gnac/CMakeTest/output/CMakeFiles/3.0.2/CMakeSystem.cmake:6 (include)
CMakeLists.txt:2 (project)
因此,除了在shell中设置永久环境变量之外,我如何通过命令行设置TC_PATH变量,以便在执行cmake generate命令时保持在上下文中?
答案 0 :(得分:2)
在编译测试项目时,CMake 默认不向其传递变量。
有 CMAKE_TRY_COMPILE_PLATFORM_VARIABLES 选项用于将变量传递到测试项目中。 为了解决您的问题,应将此行放入工具链文件中:
#include <boost/python.hpp>
#include "Bonjour.hpp"
using namespace boost::python;
BOOST_PYTHON_MODULE(pylib)
{
class_< Bonjour >("Bonjour", init<string, object, object, dict>())
.def("greet", &Bonjour::greet)
.add_property("msg", &Bonjour::get_msg, &Bonjour::set_msg);
}
答案 1 :(得分:1)
很抱歉我必须恢复它,但我仍然想知道为什么我需要求助于这样的 hack 来将变量传播到工具链配置文件:
def concat_arr(
arr1: Seq[Map[String,String]],
arr2: Seq[Map[String,String]]
) : Seq[Map[String,String]] =
{
(arr1 ++ arr2)
}
val concatUDF = udf(concat_arr _)
val df2 = df.withColumn("concatenation", concatUDF($"colArrayMap1", $"colArrayMap2"))
df2.show(false)
+--------------------+--------------------+----------------------------------------+
|colArrayMap1 |colArrayMap2 |concatenation |
+--------------------+--------------------+----------------------------------------+
|[[a -> b], [c -> d]]|[[a -> b], [c -> d]]|[[a -> b], [c -> d], [a -> b], [c -> d]]|
+--------------------+--------------------+----------------------------------------+
我的意思是,它有效,但为什么工具链文件无法正确处理上层 CMakeList 设置的变量? CMake 甚至可以打印出以这种方式设置的变量,但是除非它们是环境变量,否则检查它们是否存在之类的操作似乎不起作用。
答案 2 :(得分:0)
您的工具链需要自给自足。失败的步骤是try_compile()
,它没有获取缓存变量。
您的工具链文件看起来不像您正在进行交叉编译(它没有CMAKE_SYSTEM_NAME
),因此您可以执行以下操作之一(除了设置CC
和{{ 1}}你提到的环境变量):
只需提供CXX
和/或C
编译器的完整路径(取决于您启用的语言),CMake将检测您的其余GNU工具链自动
CXX
将以下内容添加到工具链中以跳过编译器测试(因为并非所有选项都可以传递给它,或者因为您选择的编译器/链接器不会生成有效的可执行文件)
cmake -DCMAKE_C_COMPILER:PATH=/opt/toolchain/usr/bin/i586-linux/i586-linux-gcc
-DCMAKE_CXX_COMPILER:PATH=/opt/toolchain/usr/bin/i586-linux/i586-linux-g++ ...
或者只使用CMakeForceCompiler宏,但使用的是&#34;气馁。如果可能,请避免使用此模块。&#34;
使用set(CMAKE_C_COMPILER_WORKS 1 CACHE INTERNAL "")
set(CMAKE_CXX_COMPILER_WORKS 1 CACHE INTERNAL "")
将路径放入工具链文件中(只需确保在configure_file()
调用之前执行此操作)
首选project()
如果您知道工具链的可能路径,而不是从外部设置它(请参阅here)
<强>参考强>