使用 bjam 编译的 C++ 中的未定义符号
Undefined symbol from C++ compiled using bjam
我有一个 Python 应用程序通过 Boost Python 与 C++ 接口。应用程序的 C++ 段是使用 Bjam 构建的(Bjam make 文件可以在问题底部找到)。 C++ 编译(并且看起来 link)很好。
在 Python 执行后不久,它会抱怨从 C++ 文件中引用了一个未定义的符号。此 C++ 文件包含 C++ header,其中声明了未定义的符号。如果我删除对有问题的变量的引用,代码将继续正常执行。
如果我在库中 运行 nm
它会列出带有 U(未定义)的符号。
有人可以帮助我为什么会收到这个未定义的符号 运行time 错误吗?我想这可能是因为我没有在我的 gcc 路径中包含一些东西?
python 代码调用 C++ 方法,该方法使用 C_NAMESPACE
:
中定义的变量创建 object
/dir/folder1/bridge.cpp
#include "c.h"
namespace CPP
{
void calledByPython()
{
MyClass x(C_NAMESPACE::VAR);
// continues
}
}
位于 header 文件 c.h:
/dir/folder2/c.h
#ifndef C_H
#define C_H
namespace C_NAMESPACE
{
extern const std::string VAR;
}
源文件看起来像:
/dir/folder2/c.cpp
#include "c.h"
namespace
{
const std::string VAR = "something";
}
我正在使用 bjam 构建此 C++:
import python ;
lib gbclientlib : : <name>gbclient <search>$(gbclient_dir)/lib <link>static ;
explicit gbclientlib ;
project gb
: requirements
<location>.
<cxxflags>"-std=c++11 -Wno-deprecated -I /dir/folder1/ -I /dir/folder2/"
;
python-extension _bridge : bridge.cpp ;
编译 C++ 代码时,名称会被破坏。 C 代码不会被破坏。 C++ 名称重整给公开函数带来了问题……真的是在任何地方。
问题的解决方案是将 C++ 调用包装在类似 C 的接口下,这样名称就不会被破坏。例如,要 return 你的 std::string VAR
到 C(最终 Python):
extern "C"
{
const char* get_var(void){ return VAR.c_str();}
}
Boost.Python 知道这一切,并试图通过使用 BOOST_PYTHON_MODULE
等宏隐藏 extern "C" 位来让事情变得更容易
extern "C"
技巧主要用于将 C++ 代码暴露给其他语言。 (然而,C# 有 CLR 和 PInvoke)
我有一个 Python 应用程序通过 Boost Python 与 C++ 接口。应用程序的 C++ 段是使用 Bjam 构建的(Bjam make 文件可以在问题底部找到)。 C++ 编译(并且看起来 link)很好。
在 Python 执行后不久,它会抱怨从 C++ 文件中引用了一个未定义的符号。此 C++ 文件包含 C++ header,其中声明了未定义的符号。如果我删除对有问题的变量的引用,代码将继续正常执行。
如果我在库中 运行 nm
它会列出带有 U(未定义)的符号。
有人可以帮助我为什么会收到这个未定义的符号 运行time 错误吗?我想这可能是因为我没有在我的 gcc 路径中包含一些东西?
python 代码调用 C++ 方法,该方法使用 C_NAMESPACE
:
/dir/folder1/bridge.cpp
#include "c.h"
namespace CPP
{
void calledByPython()
{
MyClass x(C_NAMESPACE::VAR);
// continues
}
}
位于 header 文件 c.h:
/dir/folder2/c.h
#ifndef C_H
#define C_H
namespace C_NAMESPACE
{
extern const std::string VAR;
}
源文件看起来像:
/dir/folder2/c.cpp
#include "c.h"
namespace
{
const std::string VAR = "something";
}
我正在使用 bjam 构建此 C++:
import python ;
lib gbclientlib : : <name>gbclient <search>$(gbclient_dir)/lib <link>static ;
explicit gbclientlib ;
project gb
: requirements
<location>.
<cxxflags>"-std=c++11 -Wno-deprecated -I /dir/folder1/ -I /dir/folder2/"
;
python-extension _bridge : bridge.cpp ;
编译 C++ 代码时,名称会被破坏。 C 代码不会被破坏。 C++ 名称重整给公开函数带来了问题……真的是在任何地方。
问题的解决方案是将 C++ 调用包装在类似 C 的接口下,这样名称就不会被破坏。例如,要 return 你的 std::string VAR
到 C(最终 Python):
extern "C"
{
const char* get_var(void){ return VAR.c_str();}
}
Boost.Python 知道这一切,并试图通过使用 BOOST_PYTHON_MODULE
extern "C"
技巧主要用于将 C++ 代码暴露给其他语言。 (然而,C# 有 CLR 和 PInvoke)