小编A. *_*lma的帖子

从 CMake 在 Windows/Visual Studio 中以调试模式强制链接 Python 发布库

我正在使用 Boost Python 为 Linux 和 Windows (Visual Studio) 开发 C++ 库的 Python 绑定。

在 Windows 中,静态 Boost Python 库依赖于 Python(这是另一个线程的动机,此处),因此,在我的 CMake 配置中,我需要执行以下操作:

if((${CMAKE_SYSTEM_NAME} STREQUAL "Linux") OR APPLE)
     target_link_libraries(my_python_module ${Boost_LIBRARIES})
elseif(WIN32 AND MSVC)
    add_definitions(/DBOOST_PYTHON_STATIC_LIB)
    target_link_libraries(my_python_module ${Boost_LIBRARIES}) #This includes the Boost Python library
    # Even though Boost Python library is included statically, in Windows it has a dependency to the Python library.
    target_link_libraries(my_python_module ${Python_LIBRARIES})
endif()
Run Code Online (Sandbox Code Playgroud)

这在 Linux 中工作得很好,但在 Windows 中,它只能在发布模式下工作,而不能在调试模式下工作,在这种情况下我总是得到:

LINK : fatal error LNK1104: Can't open file 'python37.lib' …

python cmake boost-python visual-studio-2017

5
推荐指数
1
解决办法
2787
查看次数

从引用到std :: reference_wrapper或编译器错误的隐式转换的错误理解?

我对涉及引用和std :: reference_wrapper的一些代码感到困惑,我不清楚这是否是我的错,因为我误解了引用包装器的工作原理或者我遇到编译器错误.

我有一个简单的映射,将对象的引用与复杂类配对:

std::unordered_map<Object const &obj, int32_t value> myMap;
Run Code Online (Sandbox Code Playgroud)

(为简单起见,我明确地省略了地图编译所需的哈希和相等的仿函数)

由于我不能直接在地图中使用引用,我使用它的引用包装:

std::unordered_map<std::reference_wrapper<const Object> obj, int32_t value> myMap;
Run Code Online (Sandbox Code Playgroud)

现在,我的地图填充在以下功能中:

void myFunction(Object const &obj, int32_t value)
{
    ...
    myMap.emplace(std::make_pair(obj, value));
}
Run Code Online (Sandbox Code Playgroud)

但该代码虽然编译,但不起作用.但是,这个按预期工作:

void myFunction(Object const &obj, int32_t value)
{
    ...
    myMap.emplace(std::pair<std::reference_wrapper<const Object>, int32_t>(obj, value));
}
Run Code Online (Sandbox Code Playgroud)

(在第二个版本中注意我还没有明确地为obj构建一个引用包装器)

所以,我的怀疑是:

我是否误解了参考包装器的用法?从引用到reference_wrapper没有隐式转换?如果没有,为什么代码首先编译?

或者这是std :: make_pair中的已知问题/缺陷无法正确扣除传递给它的类型?

c++ reference implicit-conversion reference-wrapper

2
推荐指数
1
解决办法
114
查看次数