标签: clang++

关于模板别名和用户定义运算符的顺序的奇怪行为

以下代码可以使用 MSVC(v19.38) 编译,但使用 GCC(13.2) 和 Clang(17.0.1) 编译失败。但旧版本的 GCC,例如 11.2,可以正常工作。

#include <type_traits>

#ifdef MY_INT
template<typename T, T V> struct my_int
{
        static constexpr T value = V;
        using value_type = T;
        constexpr operator value_type() const noexcept { return value; }
        constexpr value_type operator()() const noexcept { return value; }
};
template<auto V> using constant_int_t = my_int<decltype(V), V>;
#else
template<auto V> using constant_int_t = std::integral_constant<decltype(V), V>;
#endif

template<typename T1, typename T2>
using add_t = decltype(T1{} + T2{});

template<typename T1, typename T2>
constexpr …
Run Code Online (Sandbox Code Playgroud)

c++ name-lookup template-aliases clang++

4
推荐指数
1
解决办法
128
查看次数

CocoaPods:与libPods.a中定义的C++符号链接

我最近开始研究将levelDB集成到我的项目中的podSpec文件.(https://github.com/iljaiwas/Podspecs/blob/master/LevelDBPodSpec/0.0.1/leveldb.podspec)

但是,当我从主目标中的.mm文件引用任何C++符号时,我得到一个链接器错误,如下所示:

Undefined symbols for architecture x86_64:
 "leveldb::DB::Open(leveldb::Options const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, leveldb::DB**)", referenced  from:
  -[IHLevelDBContext initWithPath:] in IHLevelDBContext.o
Run Code Online (Sandbox Code Playgroud)

这就是编译器调用的样子

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -L/Users/ilja/Library/Developer/Xcode/DerivedData/LevelDBTest2-aiflqgbevhxzfxbrsdamteybrbao/Build/Products/Debug -F/Users/ilja/Library/Developer/Xcode/DerivedData/LevelDBTest2-aiflqgbevhxzfxbrsdamteybrbao/Build/Products/Debug -filelist /Users/ilja/Library/Developer/Xcode/DerivedData/LevelDBTest2-aiflqgbevhxzfxbrsdamteybrbao/Build/Intermediates/LevelDBTest2.build/Debug/LevelDBTest2.build/Objects-normal/x86_64/LevelDBTest2.LinkFileList -mmacosx-version-min=10.7 -ObjC -fobjc-arc -fobjc-link-runtime -stdlib=libc++ -framework Cocoa -lPods -o /Users/ilja/Library/Developer/Xcode/DerivedData/LevelDBTest2-aiflqgbevhxzfxbrsdamteybrbao/Build/Products/Debug/LevelDBTest2.app/Contents/MacOS/LevelDBTest2 
Run Code Online (Sandbox Code Playgroud)

根据我的理解,缺少:: Open调用包含在libPods.a中

nm libPods.a | grep "Open"

             U __ZN7leveldb2DB4OpenERKNS_7OptionsERKSsPPS0_
000000000005e5b1 s L___func__._ZN7leveldb6DBImpl24OpenCompactionOutputFileEPNS0_15CompactionStateE
00000000000099d0 T __ZN7leveldb2DB4OpenERKNS_7OptionsERKSsPPS0_
0000000000060ba0 S __ZN7leveldb2DB4OpenERKNS_7OptionsERKSsPPS0_.eh
Run Code Online (Sandbox Code Playgroud)

我似乎可以通过将主应用程序的"编译器"设置从Apple LLVM 4.2更改为LLVM GCC 4.2来解决链接器错误,但此编译器会阻止Objective-C 2.0功能,如下所示:

expected a property attribute before 'strong' 
Run Code Online (Sandbox Code Playgroud)

感谢您对我可能做错的任何指示,Ilja

cocoa clang++ cocoapods

3
推荐指数
2
解决办法
4097
查看次数

clang ++ mac os x c ++ 11链接器问题

我在使用来自xcode 4.6.2的clang ++在mac os x 10.8.3下使用"-std = c ++ 11 -stdlib = libc ++"编译程序时遇到问题.

当我尝试使用std :: mem_fn()或(不赞成)std :: mem_fun_ref()时,我得到链接器错误"找不到符号".相同的代码(使用std :: mem_fun_ref而不是std :: mem_fn)在c ++ 03标准下编译和链接没有任何问题.

如果我在一个对象上调用相同的成员函数而不通过mem_fn或mem_fun_ref引用它,程序将编译并运行没有任何问题.这是一个clang ++问题,一个mac os问题,还是我做错了什么?

代码:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char **arvc)
{

  /* The beginning of the function compiles without any errors */

  string str = "It's a test)";
  if (str.empty())
  {
    cout << "String is empty!!!" << endl;
  }
  vector<string> v1;
  v1.push_back("str1");
  v1.push_back("str2");
  v1.push_back("");
  v1.push_back("str4"); …
Run Code Online (Sandbox Code Playgroud)

symbols undefined c++11 clang++

3
推荐指数
1
解决办法
1431
查看次数

来自libc ++的istringstream析构函数中对operator delete的未定义引用

我尝试clang++用两种方式从trunk(~3.7)构建:通过gcc(4.8)和(旧)clang++(3.4和3.5来自数据包管理器).它们都包含相同的步骤:

export CC=clang
export CXX=clang++
export CPLUS_INCLUDE_PATH="$CPLUS_INCLUDE_PATH:$HOME/llvm/projects/libcxxabi/include"

sudo apt-get install git

cd
git clone --single-branch --branch master --depth=1 http://llvm.org/git/llvm
cd llvm/projects/
git clone --single-branch --branch master --depth=1 http://llvm.org/git/libcxxabi
git clone --single-branch --branch master --depth=1 http://llvm.org/git/libcxx
git clone --single-branch --branch master --depth=1 http://llvm.org/git/compiler-rt
cd ../tools
git clone --single-branch --branch master --depth=1 http://llvm.org/git/clang
git clone --single-branch --branch master --depth=1 http://llvm.org/git/clang-tools-extra extra
git clone --single-branch --branch master --depth=1 http://llvm.org/git/lld
git clone --single-branch --branch master --depth=1 http://llvm.org/git/lldb
git …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang clang++

3
推荐指数
1
解决办法
3926
查看次数

根据编译开关/ NDEBUG在at()和operator []之间切换std :: vector

我知道g ++(和MSVC)的开关允许对operator []进行边界检查,遗憾的是,据我所知,LLVM的libc ++没有这种开关或调试代码的完整实现.

在我当前的项目中,我一直在使用我自己的vector实现(几年前我为可移植性编写),它不会抛出异常,并且对operator []和(在实际上有一个调用另一个和他们的行为完全相同,因为没有例外).

在我完成当前程序之后,我将要移交这个代码库,它可能已经使用了很长时间.因为我不应该被要求维护它或任何我宁愿在任何地方完全符合标准,我不认为重新实现容器是符合标准的精神,(我也高度怀疑我的容器与libc ++或libstdc ++团队编写的一样好.

是否有一些预处理器魔法或类似的东西,我可以做的是使operator []在调试期间表现得像((因为它因未捕获的异常而中止)并且在我禁用此调试模式时表现得像operator []?(项目完全支持C++ 14)

c++ clang++

3
推荐指数
1
解决办法
148
查看次数

clang是否提供了unlink实现?

我正在尝试使用clang编译库.该库调用'unlink',这不是由clang定义的:

libmv/src/third_party/OpenExif/src/ExifImageFileWrite.cpp:162:17: error: use of undeclared identifier 'unlink'; did you mean 'inline'?
            unlink( mTmpImageFile.c_str() ) ;
Run Code Online (Sandbox Code Playgroud)

我的问题是,取消联系的铿锵声是什么?正如我所看到的那样,前进的道路将是#define取消与某个等效例程的联系.

c++ clang unlink clang++

3
推荐指数
1
解决办法
411
查看次数

从Objective-C函数调用C ++函数不起作用

我无法弄清楚为什么从Objective-C文件进行此简单调用的C ++函数不起作用...如何解决该问题?

上下文菜单:

#import <Cocoa/Cocoa.h>

void showMyMenu() {
    NSMenu *theMenu = [[NSMenu alloc] initWithTitle:@"Contextual Menu"];
    [theMenu insertItemWithTitle:@"Beep" action:@selector(beep:) keyEquivalent:@"" atIndex:0];
    [theMenu insertItemWithTitle:@"Honk" action:@selector(honk:) keyEquivalent:@"" atIndex:1];
    [theMenu popUpMenuPositioningItem:nil atLocation:[NSEvent mouseLocation] inView:nil];
}
Run Code Online (Sandbox Code Playgroud)

app.h:

#ifdef __cplusplus
extern "C" {
#endif

    void showMyCppMenu();

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

app.cpp:

#include "app.h"

void showMyMenu();

void showMyCppMenu() {
    showMyMenu();
}
Run Code Online (Sandbox Code Playgroud)

main.m:

#import <Cocoa/Cocoa.h>

#include "app.h"

// void showMyMenu();
// void showMyCppMenu();

int main(int argc, const char * argv[])
{
    NSApplication * application = [NSApplication sharedApplication];

    // …
Run Code Online (Sandbox Code Playgroud)

c c++ objective-c clang clang++

3
推荐指数
1
解决办法
374
查看次数

Lambda捕获数组元素失败

以下C++代码使编译器GCC(6.3.0)和Clang(3.8.0)变得疯狂.

for (auto v : vectors2d)
    for_each (begin(ret), end(ret), [v[3]] (int &n) { n+= v[3];});
Run Code Online (Sandbox Code Playgroud)

虽然以下情况很好

for (auto v : vectors2d) {
    auto val = v[3];
    for_each (begin(ret), end(ret), [val] (int &n) { n+= val;});
}
Run Code Online (Sandbox Code Playgroud)

我知道在C++ 14中我可以做类似的事情

for (auto v : vectors2d)
    for_each (begin(ret), end(ret), [val=v[3]] (int &n) { n+= val;});
Run Code Online (Sandbox Code Playgroud)

GCC中的错误是

expected identifier before '[' token
Run Code Online (Sandbox Code Playgroud)

克朗说

expected ',' or ']' in lambda capture list
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么[v[3]]出现在捕获列表中是违法的?

c++ lambda gcc language-lawyer clang++

3
推荐指数
1
解决办法
462
查看次数

GCC和Clang代码性能的巨大差异

社区.我有这段代码在欧几里德3D空间中找到最近的一对点.这个问题既不是关于算法也不是它的实现或其他什么.问题是,它运行显著当GCC而不是锵编译慢.最令人困惑的是,它在随机样本上具有可比较的执行时间,并且在某些特定样本上具有相似的100倍.我怀疑GCC中可能存在一个错误,因为我无法想到任何其他选项.

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <ctime>
#include <fstream>
#include <cassert>
#include <complex>
#include <string>
#include <cstring>
#include <chrono>
#include <random>
#include <queue>

static std::mt19937 mmtw(std::chrono::steady_clock::now().time_since_epoch().count());
int64_t rng(int64_t x, int64_t y) {
  static std::uniform_int_distribution<int64_t> d;
  return d(mmtw) % (y - x + 1) + x;
}

constexpr static int MAXN = 1e5 + 10;

void solve(std::istream &in, std::ostream &out);

void …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors g++ clang++

3
推荐指数
1
解决办法
398
查看次数

通过CMake工具链包括正确版本的STL标头

我试图建立一个CI管道与C ++一起使用。我拥有的Docker容器不支持C ++ 17,所以我想从LLVM页面下载一个发行版并正确设置。然后,我将其提取/opt/clang7。我还使用CMake工具链文件,以便它将从此clang发行版中获取include和libs等。这是我的工具链文件clang7-ci.cmake

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)

SET(CMAKE_C_COMPILER   /opt/clang7/bin/clang)
SET(CMAKE_CXX_COMPILER /opt/clang7/bin/clang++)

SET(CMAKE_FIND_ROOT_PATH  /opt/clang7)

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Run Code Online (Sandbox Code Playgroud)

我称其为CMake配置,cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/clang7-ci.cmake ..似乎是从工具链中获取了正确的clang和clang ++。正如我在CMake的配置输出中看到的那样:

-C编译器标识为Clang 7.0.1

-CXX编译器标识为Clang 7.0.1

-检查工作的C编译器:/ opt / clang7 / bin / clang

-检查工作的C编译器:/ opt / clang7 / bin / clang-工作

因此,我假设它正确使用了工具链目录,否则它将如何找到我设置的C ++编译器为clang ++。尽管如此,当我尝试使用以下命令进行构建时,它仍然给我以下错误cmake --build .

在/builds/meguli/chops/tests/answer_life/answer_life.cpp:2包含的文件中:/builds/meguli/chops/tests/answer_life/../catch.hpp:644:10:错误:没有名为'is_same_v的模板'在命名空间'std'中;你是说'is_same'吗?

           (!std::is_same_v<T, Rest> && ...) && is_unique<Rest...>
              ~~~~~^
Run Code Online (Sandbox Code Playgroud)

/usr/lib/gcc/x86_64-linux-gnu/6.3.0/../../../../include/c++/6.3.0/type_traits:1517:12:注意:此处声明为'is_same'结构is_same ^

如您所见,它将在主机目录中/usr/lib/.../inclue/6.3.0查找包含文件。这不是我想要的,我想为C ++ 17构建,我希望它包括clang发行版中的标头。我设置SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)为它将在工具链中搜索包含目录,但是它不起作用。我怎样才能让它只在下搜索/opt/clang7

c++ cmake clang++

3
推荐指数
1
解决办法
149
查看次数