这个问题的答案为什么不能用c ++ 0x模式中的libc ++来扼制这个boost :: program_options例子?陈述"你需要使用clang ++ -stdlib = libc ++重建boost."
我正在使用带有clang v3.0的MacOS Lion.如何使用clang构建Boost v1.48.0并将其与libc ++链接?
更新:我已经创建了一个user-config.jam文件,其中包含以下内容:
using clang-darwin
Run Code Online (Sandbox Code Playgroud)
...将使用clang而不是gcc构建Boost.如何链接libc ++而不是libstdc ++?
我想将我当前的项目移动到C++ 11.代码全部使用clang ++ -std = c ++ 0x编译.这是容易的部分:-).困难的部分是处理外部图书馆.人们不能依赖于将一个C++ 11对象与未使用c ++ 11编译的外部库相链接(请参阅http://gcc.gnu.org/wiki/Cxx11AbiCompatibility).例如,Boost肯定需要重新构建(为什么不能用c ++ 0x模式中的libc ++来链接这个boost :: program_options示例?).我有我使用的所有外部库的源代码,所以我可以(有些痛苦)从理论上用C++ 11重新构建这些库.但是,这仍然存在一些问题:
在混合C++ 03/C++ 11环境中开发:我有一些使用C++ 03的旧项目,需要偶尔进行维护.当然,我想将这些与现有版本的外部库链接起来.但是对于我当前(和新)的项目,我想链接到我重新构建的C++ 11版本的库.如何组织我的开发环境(目前是Ubuntu 12.04和Mac OS X 10.7)来应对这种情况?
我假设很多开发人员都会遇到这个问题.它不会消失,但我没有找到推荐的,普遍认可的解决方案.
部署:目前,我部署到云中的Ubuntu 12.04 LTS服务器.经验导致一个人(在可能的情况下)依赖于linux发行版提供的标准包(例如libboost).如果我将当前项目移动到c ++ 11,我的理解是我将不得不构建自己的外部库版本.我的猜测是,在某些时候这将改变,并且它们将是具有C++ 11兼容性的库标准的"标准"版本.当有人预料到会发生这种情况时,有谁有任何想法?并且可能这也需要上述问题的标准解决方案 - 在同一平台上同时存在C++ 03库和C++ 11库.
我希望我错过了一些基本的东西,以便这些感知的问题在适当的信息中消失!我是否想过早地转向C++ 11?
更新(2013-09-11):macports的相关讨论:https://lists.macosforge.org/pipermail/macports-users/2013-September/033383.html
如何在mac上使用libc ++或libstdc ++构建库?
我一直在使用otool -L,但这似乎没有显示它(mac没有ldd)
如果我有X库,我想知道当我从GCC转到clang时是否需要重建它.我用GCC构建了许多库,mac库通常用clang AFAIK构建.
经过大量努力,让clang和libc ++编译,运行,与NetBeans集成,甚至交叉编译到32位机器,我想我已经弄明白了!所以我去使用libstdc ++没有的一些功能(将我的开发环境颠倒过来的全部原因),并发现......我实际上无法做到这一点.
安装了libc ++,它可以运行,编译后的程序(当它工作时)确实需要它.但是,编译器仍然试图通过搞乱命名空间来抓住每个机会使用libstdc ++版本.std::__1::map
,std::__1::basic_string
等等.现在,我从这个问题中知道为什么会发生这种情况,以及为什么libc ++会这样做.我只需要知道如何删除它,因为它完全不适用 - 我真的,确实想要使用libc ++版本,我的代码中没有任何内容需要两种类型共存.
我已经尝试从包含路径中取出libstdc ++文件夹,并且失败了,这使得它们完全无法访问.没运气.我没有使用任何附加库,只使用内置的Linux/POSIX头文件(errno,socket,syslog,fcntl).
编辑:错误消息:
CoreCache.cpp:61:12: error: no member named 'emplace' in 'std::__1::map<std::__1::basic_string<char>, CacheEntry, std::__1::less<std::__1::basic_string<char> >, std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>, CacheEntry> > >'
Run Code Online (Sandbox Code Playgroud)
libstdc ++地图没有emplace().libc中++版本呢.
从命令行调用以下似乎有效:
clang++ -o stachecache -I /usr/local/lib/clang/3.1/include/ -I /usr/include/c++/v1/ -std=c++0x -stdlib=libc++ ./*.cpp
Run Code Online (Sandbox Code Playgroud)
NetBeans中的调用不会:
clang++ -stdlib=libc++ -O3 -c -O3 -Werror -MMD -MP -MF build/Release/clang-Linux-x86/CoreCache.o.d -o build/Release/clang-Linux-x86/CoreCache.o CoreCache.cpp
Run Code Online (Sandbox Code Playgroud) 我一直在尝试让C++ 11工作,在浏览了不同的网站和Q/A之后,我仍然遇到了麻烦.我想和libstdc ++一起使用clang.它在clang状态中表示它受补丁支持 - http://clang.llvm.org/libstdc++4.7-clang11.patch.我从macports下载gcc4.7并在gcc4.7的头文件中做了相应的更改
我不使用libc ++的原因是因为libc ++和libstdc ++之间的ABI兼容性,由这个线程表示:为什么不能用c ++ 0x模式中的libc ++来链接这个boost :: program_options示例?
好的,一切都完成后,我使用以下代码测试了我的设置:
#include <mutex>
#include <thread>
int main ( ) {
std::mutex myMutext;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待include应该在c ++ 11下工作.
所以这就是我用GCC编译它的方法
g++ -std=c++11 -I/opt/local/include/gcc47/c++ -L/opt/local/lib/gcc47 main.cpp -o main
Run Code Online (Sandbox Code Playgroud)
编译成功
与Clang
clang++ -std=c++11 -I/opt/local/include/gcc47/c++ -L/opt/local/lib/gcc47 main.cpp -o main
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
@work:boostTest$ clang++ -std=c++11 -I/opt/local/include/gcc47/c++ -L/opt/local/lib/gcc47 main.cpp -o main
In file included from main.cpp:1:
In file included from /opt/local/include/gcc47/c++/mutex:38:
In file included from /opt/local/include/gcc47/c++/tuple:37:
In file included from /opt/local/include/gcc47/c++/utility:70: …
Run Code Online (Sandbox Code Playgroud) 由于Boost 1.49的问题,我无法在C++程序中完成链接阶段.我已经切换到C++(-std=c++11 -libc=libc++
),它适用于另一段代码(也使用boost).使用自制软件安装Boost:
brew install boost --universal --with-mpi --with-icu
Run Code Online (Sandbox Code Playgroud)
问题始于boost::program_options
.我得到这样的链接错误:
"boost::program_options::validate(boost::any&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*, int)", referenced from:
... etc. ...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
这有点奇怪,因为在使用的库上做一个nm显示,符号似乎在那里:
nm -U /usr/local/lib/libboost_program_options-mt.dylib | grep validate
0000000000019880 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi
0000000000019880 T __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPSsi
00000000000199e0 - 01 0000 FUN __ZN5boost15program_options8validateERNS_3anyERKSt6vectorISbIwSt11char_traitsIwESaIwEESaIS7_EEPbi
00000000000199e0 …
Run Code Online (Sandbox Code Playgroud) C++ 11具有一个称为"内联命名空间"的功能,允许作者在链接时强制执行ABI兼容性,而不会篡改API.例如,来自@HowardHinnant的这些有用的答案解释了如何libc++
使用内联命名空间:
我的问题是:boost是否使用了这个C++ 11功能?看起来有些提升开发者至少在考虑最终使用它.但那个线程很老了.它曾经发生过吗?如果是这样,是否适用于所有boost库,或仅适用于子集?
我正在研究一个C++框架,当我在使用Clang的OSX上编译它时会出现一些问题.
首先,我正在使用其他一些库,例如openssl,而clang抱怨我在构建库时没有解决某些符号.它们不应该是:这些库将与最终的二进制文件链接,它不应该发生在中介上.
然后,还有一些方法和变量应该在"客户端"二进制文件中实现...使用GCC,没有问题,但Clang也抱怨这些符号在编译期间无法解决.
怎么会 ?我该怎么办 ?
这是我的CMakeLists.txt,以防有用:
cmake_minimum_required(VERSION 2.8)
project(crails_project)
set(CMAKE_CXX_FLAGS "-std=c++0x -Wall -Wno-deprecated-declarations -pedantic -DASYNC_SERVER -DSERVER_DEBUG -DUSE_MONGODB_SESSION_STORE")
find_package(cppnetlib REQUIRED)
include_directories(include /usr/local/include ${CPPNETLIB_INCLUDE_DIRS} .)
file(GLOB crails_core
src/*.cpp)
file(GLOB crails_sql
src/sql/*.cpp)
file(GLOB crails_mongodb
src/mongodb/*.cpp)
add_library(crails-core SHARED ${crails_core})
add_library(crails-sql SHARED ${crails_sql})
add_library(crails-mongodb SHARED ${crails_mongodb})
Run Code Online (Sandbox Code Playgroud)
这是崩溃的命令:
/usr/bin/c++ -std=c++0x -Wall -Wno-deprecated-declarations -pedantic -DASYNC_SERVER -DSERVER_DEBUG -DUSE_MONGODB_SESSION_STORE -dynamiclib -Wl,-headerpad_max_install_names -o libcrails-core.dylib -install_name /Users/michael/Personal/crails/build/libcrails-core.dylib CMakeFiles/crails-core.dir/src/assets.cpp.o CMakeFiles/crails-core.dir/src/cgi2params.cpp.o CMakeFiles/crails-core.dir/src/cipher.cpp.o [...]
Run Code Online (Sandbox Code Playgroud)
以下是我得到的两种错误:
架构x86_64的未定义符号:
"_BIO_ctrl", referenced from:
Cipher::encode_base64(unsigned char*, unsigned int) const in cipher.cpp.o
Run Code Online (Sandbox Code Playgroud)
第二个:
NOTE: a missing vtable usually means …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在MacOSX Yosemite上安装PyFTGL.
我使用的python版本是来自macports的2.7.我从macports安装了boost + python27.
要安装从源代码构建的PyFTGL,并从以下位置编辑setup.py文件:
module_ftgl_libs = [
'GLU',
'GL',
'freetype',
'z',
'ftgl',
'boost_python',
]
module_ftgl = Extension(
'FTGL',
module_ftgl_src,
include_dirs=module_ftgl_include_dirs,
libraries=module_ftgl_libs
)
Run Code Online (Sandbox Code Playgroud)
至:
module_ftgl_libs = [
'freetype',
'z',
'ftgl',
'boost_python',
]
module_ftgl = Extension(
'FTGL',
module_ftgl_src,
include_dirs=module_ftgl_include_dirs,
libraries=module_ftgl_libs,
extra_link_args=['-framework', 'OpenGL', '-framework', 'GLUT']
)
Run Code Online (Sandbox Code Playgroud)
然后我构建setup.py文件并将生成的FTGL.so文件复制到与使用FTGL函数的python代码test.py相同的文件夹中.
我的问题是,当我现在运行我的代码时,我收到以下错误:
Traceback (most recent call last):
File "test.py", line 29, in <module>
import FTGL
ImportError: dlopen(/Users/james/Desktop/test/FTGL.so, 2): Symbol not found:__ZN5boost6python7objects15function_objectERKNS1_11py_functionERKNSt3__14pairIPNS0_6detail7keywordESA_EE
Referenced from: /Users/james/Desktop/test/FTGL.so
Expected in: flat namespace
in /Users/james/Desktop/test/FTGL.so
Run Code Online (Sandbox Code Playgroud)
我不太了解链接,setup.py文件和提升,我花了很长时间研究Google和Stack Overflow,但现在我无法弄清楚问题.
有没有人libc++
在制作中使用clang有积极的经验?http://libcxx.llvm.org/libcxx_by_chapter.pdf上的状态图对我来说看起来不太好.