Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python CMake 3.5中的链接器标志位置_Python_C++_Cmake - Fatal编程技术网

Python CMake 3.5中的链接器标志位置

Python CMake 3.5中的链接器标志位置,python,c++,cmake,Python,C++,Cmake,我有一个非常奇怪的问题:如何让CMake 3.5在文件后放置链接器标志? 我正在尝试编译一个调用Python脚本的C++。我的CMakeList.cpp中有以下两行: add_executable (Python_trivium PyCall.cpp) set_target_properties (Python_trivium PROPERTIES COMPILE_FLAGS "${PYTHON_CFLAGS}" Python_trivium PRIVATE "${PYT

我有一个非常奇怪的问题:如何让CMake 3.5在文件后放置链接器标志? 我正在尝试编译一个调用Python脚本的C++。我的CMakeList.cpp中有以下两行:

add_executable           (Python_trivium PyCall.cpp) 
set_target_properties (Python_trivium PROPERTIES  COMPILE_FLAGS "${PYTHON_CFLAGS}" Python_trivium PRIVATE "${PYTHON_LDFLAGS}")
这将生成链接错误。通过“make VERBOSE=1”,我可以看到链接器命令如下所示:

/usr/bin/c++     -L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpython2.7 -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions CMakeFiles/Python_trivium.dir/PyCall.cpp.o  -o Python_trivium 
标志位于文件之前的位置。对于Python.h中的每个命令,我都会得到一个“undefined reference”错误,例如

/home/portolan/emanuele/MAST_project/pyhelper.hpp:12: undefined reference to `Py_Initialize'
如果在文件后反转并放置标志,则一切正常:

/usr/bin/c++   CMakeFiles/Python_trivium.dir/PyCall.cpp.o  -o Python_trivium   -L/usr/lib/python2.7/config-x86_64-linux-gnu -L/usr/lib -lpython2.7 -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions 
有没有办法让CMake以这种方式格式化链接器命令行

谢谢,
米歇尔

我发现我的错误是试图手动操作。CMake可以为我做得更好:

find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
message("PYTHONLIBS_VERSION_STRING: ${PYTHONLIBS_VERSION_STRING}")

不幸的是,它找到了3.5,而我需要2.7…

您的
set\u target\u属性
调用看起来格式不正确。在这个函数中,
PRIVATE
属性没有任何意义,您将列出目标
Python\u trivium
两次。您确定这是您正在使用的代码吗?您可以在调用
find\u package()
之前设置变量,以告诉CMake查找特定版本。您还可以使用
PYTHON\u库
PYTHON\u INCLUDE\u DIR
指向特定的PYTHON安装。对于
cmake>=3.12
,我建议使用:
find\u包(PYTHON 2.7必需的组件开发)
。然后使用目标:
Python::Python