相关疑难解决方法(0)

如何使用clang ++/libc ++编译/链接Boost?

这个问题的答案为什么不能用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++ boost clang libc++

63
推荐指数
2
解决办法
4万
查看次数

在转换到C++ 11期间管理外部库(例如boost)

我想将我当前的项目移动到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

c++ boost c++11

18
推荐指数
1
解决办法
682
查看次数

是一个在Mac上用libc ++或libstdc ++构建的库

如何在mac上使用libc ++或libstdc ++构建库?

我一直在使用otool -L,但这似乎没有显示它(mac没有ldd)

如果我有X库,我想知道当我从GCC转到clang时是否需要重建它.我用GCC构建了许多库,mac库通常用clang AFAIK构建.

c++ macos clang

13
推荐指数
2
解决办法
2473
查看次数

libc ++ - 停止std重命名为std :: __ 1?

经过大量努力,让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++ std clang libc++

10
推荐指数
1
解决办法
5499
查看次数

使用stdlibc ++ 4.7启用C++ 11时,clang错误输出,而gcc编译正常

我一直在尝试让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)

c++ macos gcc clang c++11

9
推荐指数
2
解决办法
2万
查看次数

使用LLVM将问题与OSX上的boost :: program_options联系起来

由于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++ boost clang osx-lion c++11

8
推荐指数
1
解决办法
6640
查看次数

boost是否使用C++ 11"内联命名空间"来避免运行时的ABI不兼容错误?

C++ 11具有一个称为"内联命名空间"的功能,允许作者在链接时强制执行A​​BI兼容性,而不会篡改API.例如,来自@HowardHinnant的这些有用的答案解释了如何libc++使用内联命名空间:

我的问题是:boost是否使用了这个C++ 11功能?看起来有些提升开发者至少在考虑最终使用它.但那个线程很老了.它曾经发生过吗?如果是这样,是否适用于所有boost库,或仅适用于子集?

c++ boost c++11 inline-namespaces

8
推荐指数
1
解决办法
584
查看次数

构建库时的Clang和undefined符号

我正在研究一个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)

c++ cmake clang

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

MacOSX + Boost_Python + PyFTGL: - 未找到符号,预期在:flat namespace

我正在尝试在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,但现在我无法弄清楚问题.

python macos importerror boost-python ftgl

8
推荐指数
1
解决办法
4748
查看次数

clang的libc ++生产准备好了吗?

有没有人libc++在制作中使用clang有积极的经验?http://libcxx.llvm.org/libcxx_by_chapter.pdf上的状态图对我来说看起来不太好.

c++ clang libc++

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